從a檔案判斷是否刪除b檔案中的行 sed示例

2021-09-07 17:52:23 字數 1783 閱讀 7250

bash&shell系列文章:

test.xml檔案很大,內容結構如下:

<?xml version="1.0" encoding="utf-8" standalone="no"?>

>

2016-10-31lastmod>

alwayschangefreq>

aaapriority>

url>

>

2015-11-18lastmod>

alwayschangefreq>

bbbpriority>

url>

>

2015-11-18lastmod>

alwayschangefreq>

cccpriority>

url>

>

2015-11-18lastmod>

alwayschangefreq>

dddpriority>

url>

>

2015-11-18lastmod>

alwayschangefreq>

dddpriority>

url>

......

list.txt檔案較小,內容如下:

bbb

***yyy

ccc

需求是,如果...中間包含了list.txt檔案中的某一行,則刪除這個...

在這裡需要說明下sed的侷限性:

(1).sed處理輸入流是一次性的,只要某行被sed讀取了,就一定不會再讀取。因此,讀取到某滿足匹配要求的行時,無法定位到它前面的某行、某幾行。

(2).sed自身沒有顯式的迴圈結構,例如while、for、until。但是通過某些功能的結合,可以隱式地實現迴圈。據我總結,只有標籤跳轉和"ndp"才能實現這種隱式意義上的迴圈。

(3).sed和system命令互動的侷限性非常大。只有e命令和s命令的e修飾符才能執行system中的命令。

正是這3個侷限性,導致sed實現上面的需求非常困難。

以下是一種效率非常高的方法:只讀取一次test.xml和list.txt檔案,並在每次讀取到...的時候判斷是否需要刪除這一段。

#!/usr/bin/sed -nf

\%%!p

1\%%

s%>.*%%p

執行sed:

sed -rn -f a.sed test.xml
由於上面示例檔案中bbbccc的bbb、ccc存在於list.txt檔案中,因此這兩個...段落要刪除。執行結果為:

<?xml version="1.0" encoding="utf-8" standalone="no"?>

>

2016-10-31lastmod>

alwayschangefreq>

aaapriority>

url>

>

2015-11-18lastmod>

alwayschangefreq>

dddpriority>

url>

>

2015-11-18lastmod>

alwayschangefreq>

dddpriority>

url>

思路大致為:

php判斷是否是檔案 php 判斷檔案是否存在

sha1 file 計算文字檔案sha 1雜湊 sha1 file file 語法 sha1 file file,raw 引數 file 必需。規定要計算的檔案。raw 可選。布林值,規定十六進製制或二進位制輸出格式 true 原始 16 字元二進位制格式 false 預設。32 字元十六進製制數 ...

判斷檔案是否存在

c 判斷檔案是否存在 int access const char filename,int amode 函式用法 寬位元組int waccess const char filename,int amode c 判斷檔案是否存在 標頭檔案 access const char filename,int ...

Shell中判斷檔案,目錄是否存在

e filename 如果 filename存在,則為真 d filename 如果 filename為目錄,則為真 f filename 如果 filename為常規檔案,則為真 l filename 如果 filename為符號鏈結,則為真 r filename 如果 filename可讀,則為...