SEDを使用してキャプチャされたグループの交換

SEDを使用してキャプチャされたグループの交換

xxxxxx15 |xxxxxx02|RM99999 |xxxxxx |アンクール|xxxxx |xxxxxxxx|M|xxxxxxxx|

10を65に変えたいです。ワードローブにたくさんsed -i '/^.\{20\}RM99999/ s/^\(?:[^|]*\|\)\{16\}\([^|]*\)/\165/' test.txt

ただし、最初の文字を65に置き換えます(より多くの場所にある可能性がありますが、行のRM9999920番目の文字を置き換える必要があります)。RM99999

答え1

XYの問題のようです。

awkを使ってみてはいかがでしょうか?

awk -F\| -v OFS=\| '$3=="RM99999" && $17 == 10 { $17=65 } {print ; } '

どこ

  • -F\|awkに|をフィールド区切り文字として使用するように指示する(\シェルにエスケープを指示する|
  • -v OFS=\|レコードを出力するときにフィールドを区切り文字として使用するようにawkに指示します。
  • $3=="RM99999" && $17 == 10RM99999は3行目、10は17行目を選択してください。
  • $17 = 6565に交換
  • { print ; }変更されたパターンと変更されていないパターンの両方を印刷する

答え2

sed '/^.\{19\}RM99999/s/10/65/' <in >out

文字列の最初の項目を置き換えます。10文字列の使用65文字列のある行にRM9999920番目の文字から始めます。

一部の人々はフィールド17を交換する必要があると思います。質問で見ることができないので、なぜそうなのかわかりません。しかし、それがあなたが望むものなら...

sed '/^.\{19\}RM99999/s/[^|]*/65/17' <in >out

... |17番目の区切りフィールドが文字列に置き換えられます。65文字列のある行にRM9999920番目の文字から始めます。

私はストローを握っていますが、おそらくそれはただ10、フィールド17、そしてただRM9999920文字で始めますか?少し難しいです...

sed -e'/^.\{19\}RM99999/s/|/|\n/16' \
    -e's/\n\([^|]*\)10/\165/;s/\n//' <in >out

...しかし、これを行うだけです。よく考えてみるとそうだ。少し自分のコードに似ています。たぶんそれは私たちがやりたいことかもしれません。

これはもう少し直感的です...

sed -e'/^.\{19\}RM99999/!b'    \
    -e's/|\([^|]*10\)*/&\n/16' \
    -e's/10\n/65/;s/\n//'

フィールド数が固定されている場合は、この手順を完了できます。

sed -e'/^.\{19\}RM99999/s/10\([^|]*\(|[^|]*\)\{7\}\)$/65\1/'

もちろん、フロントエンドでも同じことができます。

sed -e'/^.\{19\}RM99999/s/^\([^|]*\(|[^|]*\)\{16\}\)10/\165/'

しかし、尾にはフィールド数が半分しかないので、役に立つならこれをしないことをお勧めします。

拡張正規表現構文を使用すると、書くのが少し簡単です。

sed -Ee'/^.{19}RM99999/s/10([^|]*(\|[^|]*){7})$/65\1/'

関連情報