如何在 bash 中第 n 次出現後添加文字?

如何在 bash 中第 n 次出現後添加文字?

假設我有 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:]].

相關內容