如何使用sed从bash中删除字符串中的最后一个字符?

mar*_*aro 0 regex bash sed

我想通过修改最后的所有"a"来改变所有出现的事件,如"waaa","wwwaaaaa","wa".

waaa> w
wwa> ww
waaaaa> w

我知道如何使用正则表达式在文本中找到这些字符串:

grep -nE "wa+" file.txt
Run Code Online (Sandbox Code Playgroud)

我也知道如何在bash脚本中更改一个字符串

#!/bin/bash
s1="wwwwaaaaaaaa"
s2=${s1%w*}
echo "$s1 --> $s2"
Run Code Online (Sandbox Code Playgroud)

(修改后的脚本来自/sf/answers/1936110221/)

但是我想使用像

sed -E 's/wa+/ZZZ/' file.txt
Run Code Online (Sandbox Code Playgroud)

ZZZ是我需要的东西.

sed -E 's/wa+/${$1%w*}/' file.txt
Run Code Online (Sandbox Code Playgroud)

不起作用.

样本输入:

Lorem ipsum wa waaaaaaa saaa dolor sit amet,
consectetur aw awwwwaaaa adipiscing elit

理想的输出:

Lorem ipsum w w saaa dolor sit amet,
consectetur aw awwww adipiscing elit

Pes*_*The 5

sed 's/waa*\b/w/g' file
Run Code Online (Sandbox Code Playgroud)
sed 's/waa*\>/w/g' file
Run Code Online (Sandbox Code Playgroud)

或使用扩展正则表达式:

sed -r 's/wa+\b/w/g' file
Run Code Online (Sandbox Code Playgroud)

\b并且\>是字边界.有关更多信息,请参阅此正则表达式教程:Word Boundaries.