![bash で n 番目の出現の後にテキストを追加するにはどうすればよいでしょうか?](https://rvso.com/image/169443/bash%20%E3%81%A7%20n%20%E7%95%AA%E7%9B%AE%E3%81%AE%E5%87%BA%E7%8F%BE%E3%81%AE%E5%BE%8C%E3%81%AB%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.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
英数字のみで構成される空でない文字列の 2 番目の一致を置き換えます。
隣接する\<
と は、\>
それぞれ一致の開始と終了で、単語と非単語の間のゼロ幅境界に一致します (GNU ではsed
、これらに も使用できます\b
)。これにより、単語全体が一致することが保証されますが、指定されたデータでは実際には必要ありません (私が行っていることの意図を強調するため、単語境界パターンを使用します)。
は、拡張正規表現で記述され、先行するパターンが少なくとも 1 回一致するようにする\{1,\}
修飾子です(ただし、デフォルトでは基本正規表現が使用されます)。+
sed
置換部分では、&
は実際にパターンに一致する入力文字列のビットになり、2
最後の は、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:]]
。