Bash输出删除两个字符之间的文本

时间:2017-10-26 03:41:45

标签: regex bash awk sed

我有bash命令的输出:

8.8.8.8#53 google-public-dns-a.google.com. A

我想在bash命令中添加一个正则表达式,从#删除到下一个空格,以获得所需的输出:

8.8.8.8 google-public-dns-a.google.com. A

我已尝试将输出汇总到 sed 's/#.*?\s//' (理论上它也会删除尾随空格,但这是可以接受的),但输出仍与原始输出相同。

有关如何实现所需输出的任何建议吗?

5 个答案:

答案 0 :(得分:1)

您不需要sedawk或任何其他工具,而不是shell自己的内置字符串操作。

shopt -s extglob

s='8.8.8.8#53 google-public-dns-a.google.com. A'
s_pruned="${s//#+([[:digit:]])/}"
echo "$s_pruned"

......正确发出:

8.8.8.8 google-public-dns-a.google.com. A

答案 1 :(得分:0)

使用sed如下。

sed 's/#[^ ]*//'

删除#,然后删除所有非空格的内容,直至看到第一个空格。

或在bash中使用相同的内容:

str='8.8.8.8#53 google-public-dns-a.google.com. A'
echo "${str//#+([^ ])/}"

答案 2 :(得分:0)

您也可以尝试跟随sed一次。

sed 's/\([^#]*\)\([^a-zA-Z]*\)\(.*\)/\1 \3/g'   Input_file

输出如下。

8.8.8.8 google-public-dns-a.google.com. A

答案 3 :(得分:0)

Bash本身具有内置的高质量正则表达式功能(如果有点罗嗦......)

你可以这样做:

$ txt="8.8.8.8#53 google-public-dns-a.google.com. A"
$ [[ $txt =~ ^([^#]+)#[^[:space:]]+(.*) ]] && echo ${BASH_REMATCH[1]}${BASH_REMATCH[2]}
8.8.8.8 google-public-dns-a.google.com. A

答案 4 :(得分:0)

sed不支持“非贪婪”操作员。

但我认为你可以很容易地解决这个问题。做

rsyslogd -N1