簡體   English   中英

我可以使用“ sed”來搜索和替換K個LINE事件嗎?

[英]Can I use 'sed' to search and replace K number of LINE occurrences?

我正在嘗試搜索並替換許多文件。 我首先考慮使用“ sed”,但我認為我的要求可能會使“ sed”不合適。

簡而言之,假設我有一個文件,其中出現了4個“ KEYWORD”。 它們在一行中發生一次,但在4條不同的行中發生。

問題:我可以僅使用“ sed”代替前兩個事件。 如果沒有,請您推薦Linux中可用的其他工具。 暫時,我們不要討論如何使用編程語言(python,ruby,java)來做到這一點。

我遇到了如何在一行中更改K個事件的發生次數,但是我還沒有看到如何替換K個行的發生次數(如果您知道我的意思)。

如果您有任何想法,請告訴我。

awk在這里可能很方便:

awk 'i<2{i+=sub(/KEYWORD/, "FOOBAR")} 1' file

這可能對您有用(GNU sed):

sed -r '/KEYWORD/{G;h;/(\n[^\n]*){3}/!s/KEYWORD/REPLACEMENT/;s/\n.*//}' file

使用-r開關可以使正則表達式更容易使用。

專注於僅包含KEYWORD行。

將保留空間(HS)用作變量,計算遇到KEYWORD的次數。 將保留空間附加到模式空間(PS),並為附加的每行引入一個換行符( \\n )。 換行符的獨特之處在於,在正常處理中,通過sed將其從模式空間中刪除。 附加HS后,用當前PS替換HS(准備下一次替換)。 如果PS中少於3行,則用REPLACEMENT KEYWORD 刪除附加的行,然后繼續正常進行處理。

注意:數字3 (n + 1)可以更改為所需的任何數字,也可以通過取消替換( ! )的取反來實現,即實現替換之前遇到的KEYWORDS的數量。

在反思中,更通用的解決方案:

sed -r '/KEYWORD/{G;h;/^[^\n]*(\n[^\n]*){1,2}$/s/KEYWORD/REPLACEMENT/;s/\n.*//}' file

因為它也被標記為“ sed”,並且很有趣(並且可能證明sed 不是這里的最佳工具):您可以使用

repl=2
for (( i = 0; i < repl; ++i )); do
    sed -i '0,/KEYWORD/ s//substitution/' infile
done

也就是說,您可以多次替換第一次出現的情況。 缺點:這將處理每個循環的整個文件,而0地址(如果KEYWORD出現在第一行的情況下)是GNU sed擴展名。

我非常確定它可以完全在sed中完成(實際上, 我確定 ),但是計數並不理想,例如,請參見sed手冊中的“ 遞增數字 ”位。

暫無
暫無

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

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