![如何在 bash 中第 n 次出現後添加文字?](https://rvso.com/image/169443/%E5%A6%82%E4%BD%95%E5%9C%A8%20bash%20%E4%B8%AD%E7%AC%AC%20n%20%E6%AC%A1%E5%87%BA%E7%8F%BE%E5%BE%8C%E6%B7%BB%E5%8A%A0%E6%96%87%E5%AD%97%EF%BC%9F.png)
假設我有 helloworld.txt:
hello world
使用 sed:
sed 's/w*/goodbye/' helloworld.txt
給我:
goodbyehello world
和:
sed 's/$/goodbye/' helloworld.txt
給我:
hello worldgoodbye
但如何添加文字後第一次出現,所以看起來像這樣:
hellogoodbye world
答案1
假設您正在談論在特定的出現之前或之後插入文本字在一行文字中。
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/newword &/'
newword word1 word2 word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/'
word1 newword word2 word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/2'
word1 word2 newword word3 word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/3'
word1 word2 word3 newword word4
$ echo 'word1 word2 word3 word4' | sed 's/\<[[:alnum:]]\{1,\}\>/& newword/4'
word1 word2 word3 word4 newword
這會將字串newword
(以及前面的空格)插入到給定字串的不同位置。
表達sed
方式
s/\<[[:alnum:]]\{1,\}\>/& newword/2
將替換僅包含字母數字字元的非空字串的第二個匹配項。
側翼\<
和\>
分別匹配匹配開始和結束處的單字和非單字之間的零寬度邊界(在 GNU 中sed
,您也可以使用\b
這些)。這可以確保您匹配整個單詞,但對於給定的數據來說並不是真正需要的(我使用單詞邊界模式,因為它強調了我正在做的事情的意圖)。
是\{1,\}
一個用擴展正規表示式編寫的修飾符+
,使前面的模式至少匹配一次(但sed
預設使用基本正規表示式)。
在替換部分中,&
將是輸入字串中實際與模式匹配的位,末尾的2
是一個標誌,使替換僅針對第二個非重疊匹配發生。
例子在你的評論中(幾乎相同,但沒有插入空格):
$ echo '7DF258 01DB-MET-RX PASS' | sed 's/\<[[:alnum:]-]\{1,\}\>/&FIDUCIAL/'
7DF258FIDUCIAL 01DB-MET-RX PASS
$ echo '7DF258 01DB-MET-RX PASS' | sed 's/\<[[:alnum:]-]\{1,\}\>/&FIDUCIAL/2'
7DF258 01DB-MET-RXFIDUCIAL PASS
請注意,在您在註釋中給出的示例中,“單詞”還包含破折號,這就是我使用[[:alnum:]-]
而不僅僅是[[:alnum:]]
.