xxxxxx15 |xxxxxx02|RM99999 |xxxxxx |アンクール|xxxxx |xxxxxxxx|M|xxxxxxxx|
10を65に変えたいです。ワードローブにたくさんsed -i '/^.\{20\}RM99999/ s/^\(?:[^|]*\|\)\{16\}\([^|]*\)/\165/' test.txt
ただし、最初の文字を65に置き換えます(より多くの場所にある可能性がありますが、行のRM99999
20番目の文字を置き換える必要があります)。RM99999
答え1
XYの問題のようです。
awkを使ってみてはいかがでしょうか?
awk -F\| -v OFS=\| '$3=="RM99999" && $17 == 10 { $17=65 } {print ; } '
どこ
-F\|
awkに|をフィールド区切り文字として使用するように指示する(\
シェルにエスケープを指示する|
)-v OFS=\|
レコードを出力するときにフィールドを区切り文字として使用するようにawkに指示します。$3=="RM99999" && $17 == 10
RM99999は3行目、10は17行目を選択してください。$17 = 65
65に交換{ 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/'