我有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//'
(理论上它也会删除尾随空格,但这是可以接受的),但输出仍与原始输出相同。
有关如何实现所需输出的任何建议吗?
答案 0 :(得分:1)
您不需要sed
,awk
或任何其他工具,而不是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