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
由於上面示例檔案中bbb
和ccc
的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可讀,則為...