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

时间:2018-01-04 17:48:02

标签: regex bash sed

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

waaa> w ^
wwa> WW
waaaaa>瓦特

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

grep -nE "wa+" file.txt

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

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

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

但我想使用像

这样的东西
sed -E 's/wa+/ZZZ/' file.txt

这里我需要ZZZ。

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

不起作用。

示例输入:

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

2 个答案:

答案 0 :(得分:5)

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

或使用扩展正则表达式:

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

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

答案 1 :(得分:0)

使用bash,使用extended pattern matching删除字符串末尾的所有“a”:

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