После использования фильтра получим список процессов, подобный следующему:
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:~$