ファイル内の同じ単語で2番目に表示されるパターンを置き換えるには、sedコマンドを使用しないでください。

ファイル内の同じ単語で2番目に表示されるパターンを置き換えるには、sedコマンドを使用しないでください。
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つのフィールドでのみ置換を実行し、結果の行を印刷します。

関連情報