フィルターを使用して次のようなプロセスのリストを取得します。
FOO_AAAAA_00001
FOO_BBBBB_00001
FOO_ABABAB_0000
FOO_ABCCDAA_00
FOO_12345678_0
FOO_JJJ_00001
FOO_VLLLL_00001
FOO_KKAKAA_00001
長さが一定数を超えると文字列は切り取られます。その名前を使用する別のスクリプトのプロセス名の最後の部分を変更する必要があります。問題は、名前が 00001 で終わることです。
私は次のようなことを試しました
[...]|sed 's/000/00001/g[...]
しかし、問題は明らかです。正しい文字列も変更されます。私の質問は、チェーンが 0,00,000 から 0001 の場合に、他のものを変更せずに sed を使用して正しく変更できる方法があるかどうかです。
上記のリストがあるとします:
FOO_AAAAA_00001
FOO_BBBBB_00001
FOO_ABABAB_0000
FOO_ABCCDAA_00
FOO_12345678_0
FOO_JJJ_00001
FOO_VLLLL_00001
FOO_KKAKAA_00001
最初と最後のものは正しいです。次のようなものを取得する必要があります:
FOO_AAAAA_00001
FOO_BBBBB_00001
FOO_ABABAB_00001
FOO_ABCCDAA_00001
FOO_12345678_00001
FOO_JJJ_00001
FOO_VLLLL_00001
FOO_KKAKAA_00001
ありがとう
答え1
これは、パターン空間内での3番目の出現箇所を、文字列の0個以上のアンダースコア以外の文字に置き換えます。00001
。
sed 's/[^_]*/00001/3' <in >out
答え2
ついに
virt01@virt01:~$ sed 's/_0*$/_00001/g' some.txt
somestring_oooo_00001
somestring_oooo_00001
somestring_oooo_00001
virt01@virt01:~$
あなたのデータにぴったり
virt01@virt01:~$ cat some.txt
FOO_AAAAA_00001
FOO_BBBBB_00001
FOO_ABABAB_0000
FOO_ABCCDAA_00
FOO_12345678_0
FOO_JJJ_00001
FOO_VLLLL_00001
FOO_KKAKAA_00001
virt01@virt01:~$ sed 's/_0*$/_00001/g' some.txt
FOO_AAAAA_00001
FOO_BBBBB_00001
FOO_ABABAB_00001
FOO_ABCCDAA_00001
FOO_12345678_00001
FOO_JJJ_00001
FOO_VLLLL_00001
FOO_KKAKAA_00001
virt01@virt01:~$