echo "abcdef12cade 12345678 abcdefba12345678" | sed -E "s/[0-9a-fA-F]{8}/00000000/g"
上記の出力は次のとおりです。
00000000cade 00000000 0000000000000000
同じ単語で2番目に現れるパターンを変更することです。二度と発生したら交換したくない
期待される出力
00000000cade 00000000 abcdefba12345678
答え1
一致の最初の項目のみを置き換えるには、g
次のコマンドのサフィックスを使用しないでください。
$ echo 'aa' | sed 's/a/b/g'
bb
$ echo 'aa' | sed 's/a/b/'
ba
このg
オプションは「グローバル」を表し、sed
最初の一致(デフォルトの動作)だけでなく、すべての一致を置き換えるように明示的に指示します。
答え2
最初の8桁の16進数を置き換えて、8から15文字の間の単語を探しているようです。
sed -E 's/\<[[:xdigit:]]{8}([[:xdigit:]]{0,7})\>/00000000\1/g' <<END
abcdef12cade 12345678 abcdefba12345678 12345 123456789
END
00000000cade 00000000 abcdefba12345678 12345 000000009
ここで\<
、\>
およびは単語の境界であり、[:xdigit:]
16進数と一致します。
答え3
g
最終確認は、sed
ラインでできるだけ多くの交換を繰り返す。二度だけやりたいです。
GNUを使ってこれを行いましょうawk
。
echo 'abcdef12cade 12345678 abcdefba12345678' |
awk '{ sub("[0-9a-fA-F]{8}", "00000000", $1)
sub("[0-9a-fA-F]{8}", "00000000", $2)
print }'
これは、スペースで区切られた最初の2つのフィールドでのみ置換を実行し、結果の行を印刷します。