用其他内容替换词尾

用其他内容替换词尾

我有这个:

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 脚本中完成此操作。

答案1

要匹配模式末尾的空格或换行符,您可以使用:

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

答案2

awk 会将字符串分成三部分并对所需元素进行替换。然后print $0将返回整个(新)字符串。

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

答案3

您可以使用“词尾”标记:

$ 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匹配任何单词边界,但如果它跟随单词字符,则相当于\>.

答案4

'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

相关内容