关于正则表达式:如何使用sed删除bash中字符串中的最后一个字符?

How to remove last characters from a string in bash using sed?

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

waaa> w
wwa> ww
waaaaa> w

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

1
grep -nE"wa+" file.txt

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

1
2
3
4
#!/bin/bash
s1="wwwwaaaaaaaa"
s2=${s1%w*}
echo"$s1 --> $s2"

(修改后的脚本来自https://stackoverflow.com/a/27658717/5219155)

但是我想使用像

1
sed -E 's/wa+/ZZZ/' file.txt

ZZZ是我需要的东西。

1
sed -E 's/wa+/${$1%w*}/' file.txt

不起作用。

样本输入:

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

理想的输出:

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


1
sed 's/waa*\b/w/g' file
1
sed 's/waa*\>/w/g' file

或使用扩展正则表达式:

1
sed -r 's/wa+\b/w/g' file

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


使用bash,使用扩展模式匹配从字符串末尾删除所有"a":

1
2
3
4
5
shopt -s extglob
for str in"waaa""wwwaaaaa""wa"; do
    new="${str%%+(a)}ZZZ"
    echo"$str => $new"
done
1
2
3
waaa => wZZZ
wwwaaaaa => wwwZZZ
wa => wZZZ