Nachdem Sie einen Filter verwendet haben, erhalten Sie eine Liste von Prozessen wie die folgende:
FOO_AAAAA_00001
FOO_BBBBB_00001
FOO_ABABAB_0000
FOO_ABCCDAA_00
FOO_12345678_0
FOO_JJJ_00001
FOO_VLLLL_00001
FOO_KKAKAA_00001
Die Zeichenfolge wird abgeschnitten, wenn die Länge eine bestimmte Zahl überschreitet. Ich muss den letzten Teil des Namens des Prozesses für ein anderes Skript ändern, das diesen Namen verwendet. Das Problem ist, dass Namen auf 00001 enden.
Ich habe so etwas versucht wie
[...]|sed 's/000/00001/g[...]
aber das Problem ist offensichtlich. Es ändert auch die richtigen Zeichenfolgen. Meine Frage ist, gibt es eine Möglichkeit, sed zu verwenden, um die Änderung korrekt vorzunehmen, wenn die Kette 0,00,000 bis 0001 ist, ohne die anderen zu ändern?
Nehmen wir an, ich habe die obige Liste:
FOO_AAAAA_00001
FOO_BBBBB_00001
FOO_ABABAB_0000
FOO_ABCCDAA_00
FOO_12345678_0
FOO_JJJ_00001
FOO_VLLLL_00001
FOO_KKAKAA_00001
Der erste und der letzte sind richtig. Ich brauche so etwas wie:
FOO_AAAAA_00001
FOO_BBBBB_00001
FOO_ABABAB_00001
FOO_ABCCDAA_00001
FOO_12345678_00001
FOO_JJJ_00001
FOO_VLLLL_00001
FOO_KKAKAA_00001
Danke
Antwort1
Dadurch wird das dritte Vorkommen im Musterraum der längsten möglichen Übereinstimmung für 0 oder mehr Zeichen, die keine Unterstriche sind, für die Zeichenfolge ersetzt.00001
.
sed 's/[^_]*/00001/3' <in >out
Antwort2
Endlich
virt01@virt01:~$ sed 's/_0*$/_00001/g' some.txt
somestring_oooo_00001
somestring_oooo_00001
somestring_oooo_00001
virt01@virt01:~$
Genau für Ihre Daten
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:~$