使用 sed 更改字符串

使用 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

当长度超过一定数量时,绳子就会被切断。我需要更改使用该名称的另一个脚本的进程名称的最后部分。问题是名称以 00001 结尾。

我试过类似的东西

[...]|sed 's/000/00001/g[...]

但问题是显而易见的。它也会改变正确的字符串。我的问题是,有一种方法可以使用 sed 在链从 0,00,000 到 0001 时正确进行更改,而不改变其他链?

假设我有上面的列表:

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

这将用字符串的 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:~$

相关内容