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