次のような多くの行を含む test.txt ファイルがあります。
hello:123: world
hello:783: world
hello:479: world
......
sed
コマンドを使用して次の行を置き換える方法は?
hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world
......
よろしくお願いします!
答え1
これについてどう思いますか?これがあなたに必要なものであることを願っています。
sed -e 's/\([0-9]\+\)/(\1, 0)/g'
テスト
echo "hello:123: world
hello:783: world
hello:479: world" | sed -e 's/\([0-9]\+\)/(\1, 0)/g'
結果
こんにちは: (123, 0): 世界
こんにちは: (783, 0): 世界
こんにちは: (479, 0): 世界
答え2
POSIX的に:
sed 's/[0-9]\{1,\}/(&, 0)/' < file
\{1,\}
各行で、1つ以上の()10進数シーケンスの最初の項目を(&, 0)
(&
置き換えるテキストの位置)に置き換えます。
sed
一部の実装では、代替が使用可能な場合は、基本-E
正規表現(BRE)の代わりに拡張正規表現(ERE)を使用することを選択できます。 POSIX仕様の次のバージョンにすることができます。+
\{1,\}
-E
sed -E 's/[0-9]+/(&, 0)/' < file
いくつかのsed
実装(例:GNU)はBREをエイリアスとしてsed
サポートしますが、これは移植可能/標準ではありません。\+
\{1,\}
正規表現の新しい事実上標準となっているPerl正規表現を使用するには、次のものを使用できますperl
。
perl -pe 's/\d+/($&, 0)/' < file
答え3
入力に:
区切られたテキストがあり、2番目の列を変更する必要があるとします。
$ awk 'BEGIN{ FS=OFS=":" } {$2 = "("$2", 0)"} 1' ip.txt
hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world
またはperl
$ perl -F: -lane '$F[1] = "($F[1], 0)"; print join ":",@F' ip.txt
hello:(123, 0): world
hello:(783, 0): world
hello:(479, 0): world