簡體   English   中英

如何結合多個sed和awk命令?

[英]How to combine multiple sed and awk commands?

我有一個包含約200萬個文件的文件夾。 我需要運行以下命令:

sed -i 's/<title>/<item><title>/g;s/rel="nofollow"//g;s/<\/a> &bull;/]]><\/wp:meta_value><\/wp:postmeta><content:encoded><![CDATA[/g;s/By <a href="http:\/\/www.website.com\/authors.*itemprop="author">/<wp:postmeta><wp:meta_key><![CDATA[custom_author]]><\/wp:meta_key><wp:meta_value><![CDATA[/g' /home/testing/*

sed -i '$a]]></content:encoded><wp:status><![CDATA[draft]]></wp:status><wp:post_type><![CDATA[post]]></wp:post_type><dc:creator><![CDATA[Database]]></dc:creator></item>\' /home/testing/*

awk -i inplace 1 ORS=' ' /home/testing/*

我遇到的問題是,當我運行第一個命令時,它將遍歷所有200萬個文件,然后繼續執行第二個命令,依此類推。 問題是我基本上必須總共打開600萬次文件。

我希望在打開每個文件時,在其上運行所有3個命令,然后將其移至下一個。 希望這是有道理的。

您可以在一個awk命令中執行所有操作,如下所示:

awk -i inplace -v ORS=' ' '{
    gsub(/<title>/,"<item><title>")
    gsub(/rel="nofollow"/,"")
    gsub(/<\/a> &bull;/,"]]><\/wp:meta_value><\/wp:postmeta><content:encoded><![CDATA[")
    gsub(/By <a href="http:\/\/www.website.com\/authors.*itemprop="author">/,"<wp:postmeta><wp:meta_key><![CDATA[custom_author]]><\/wp:meta_key><wp:meta_value><![CDATA[")
    print $0 "]]></content:encoded><wp:status><![CDATA[draft]]></wp:status><wp:post_type><![CDATA[post]]></wp:post_type><dc:creator><![CDATA[Database]]></dc:creator></item>"
}' /home/testing/*

但這並不意味着它一定是您想要做的最好的方法。

上面的內容依靠我正確地解釋了您的命令正在執行的操作,並且由於您沒有提供任何示例輸入和預期輸出,因此顯然未經測試。 它仍然像您的原始腳本一樣依賴於-i inplace GNU awk。

假設您的文件足夠小,以至於單個文件可以整體上容納到內存中(並假定為GNU sed ,那么您使用-i不帶選項參數意味着):

sed -i -e ':a;$!{N;ba}; s/.../.../g; ...; $a...' -e 's/\n/ /g' /home/testing/*

s/.../.../g; ...; 上面命令中的$a...$a...代表實際的替換和附加命令。

:a;$!{N;ba}; 整體讀取每個輸入文件,然后執行所需的替換,附加和替換所有換行符,每個換行符用一個空格隔開。 [1]

這使您可以對每個輸入文件使用單個sed命令。


[1]您的awk 1 ORS=' '命令實際上創建帶有尾隨空格而不是換行符的輸出。 相比之下,應用於整個輸入文件的's/\\n/ /g'將僅在行之間放置一個空格,並以換行符終止整個文件(假設輸入文件以1結尾)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM