Замена конца слова чем-то еще

У меня есть это:

echo "walking ringer talking" 

Как использовать sed для достижения следующего результата?

 walked ringer talked 

Я пробовал несколько способов, но не могу заставить его работать. Следующие команды – это то, что я пробовал.

 echo "walking ringer talking" | sed 's/ing/ed/g' 

Эти выходы walked reder talked .

 echo "walking ringer talking" | sed 's/ing$/ed/g' 

Это выводит walking ringer talked .

 echo "walking ringer talking" | sed 's/^ing/ed/g;s/ing$/ed/g' 

Это выводит walking ringer talked .

Я пытаюсь сделать это в сценарии bash.

добавить пробел 's/ing /ed /g; в вашем третьем тесте;

 #echo "walking ringer talking" | sed 's/^ing/ed/g;s/ing$/ed/g' echo "walking ringer talking" | sed 's/ing /ed /g;s/ing$/ed/g' 

например:

 user@host:/tmp/test$ echo "walking ringer talking" | sed 's/ing /ed/g;s/ing$/ed/g' walked ringer talked 

Чтобы соответствовать пробелу или новой строке в конце шаблона, вы можете использовать:

 sed -E 's/ing( |$)/ed\1/g' 

Awk разделит строку на три части и применит замену на нужные элементы. Затем print $0 вернет всю (новую) строку.

 echo $s | awk 'BEGIN{a[1]=a[3]}{for(x in a)gsub("ing","ed",$x); print $0 }' 

Вы можете использовать маркер «конец слова»:

 $ echo "walking ringer talking" | sed 's/ing\>/ed/g' walked ringer talked 

\> совпадает с символами слова слева и символами без слова справа.

Или, менее конкретный, со словом границы:

 $ echo "walking ringer talking" | sed 's/ing\b/ed/g' walked ringer talked 

\b соответствует любой границе слова, но если она соответствует символам слов, она эквивалентна \> .