sed,只捕获数字

时间:2013-11-18 15:49:36

标签: bash sed numbers

我有这个文本文件:

some text A=10 some text
some more text A more text
some other text A=30 other text

我正在尝试使用sed仅捕获A的数值。使用此

cat textfile | sed -r 's/.*A=(\S+).*/\1/'

我明白了:

10
some more text A more text
30

但我真正需要的是:

10
0
30

如果字符串A=不存在,则输出0。我怎么能做到这一点?

8 个答案:

答案 0 :(得分:2)

我想不出一个单行,所以这是我的方法:

while read line
do
grep -Po '(?<=A=)\d+' <<< "$line" || echo "0"
done < file

我使用后视grep来获取A=之后的任何数字。如果没有,||(其他)将打印0

答案 1 :(得分:1)

我喜欢代码高尔夫!

sed -e 's/^/A=0 /; s/.*\<A=\(\d\+\).*/\1/'

在替换之前,这前缀为A=0

答案 2 :(得分:1)

试试这个单行:

awk -F'A=' 'NF==1{print "0";next}{sub(/ .*/,"",$2);print $2}' file

包含您的数据:

kent$  echo "some text A=10 some text
some more text A more text
some other text A=30 other text"|awk -F'A=' 'NF==1{print "0";next}{sub(/.*/,"",$2);print $2}'
10
0
30

答案 3 :(得分:1)

awk '{$0=gensub(/^.*A=?([[:digit:]]+).*$/, "\\1", "g"); print($0+0)}' file.txt

答案 4 :(得分:1)

这可能适合你(GNU sed):

sed '/.*A=\([0-9][0-9]*\).*/s//\1/;t;s/.*/0/' file

查找字符串A=后跟一个或多个数字,如果发生,则用后引用替换整行。否则,请用0替换整行。

答案 5 :(得分:0)

我认为最好的方法是做两个不同的命令 - 第一个用'A ='代替'A ='的行代替'A =',第二个代替你做的。

所以

cat textfile | sed -r 's/^([^A]|A[^=)*$/A=0/' | sed -r 's/.*A=(\S+).*/\1/'

答案 6 :(得分:0)

怎么样:

sed -r -e 's/.*A=(\S+).*/\1/' -e 's/.*A.*/0/'

答案 7 :(得分:0)

一些grep-sed-cut组合:

grep -o 'A=\?[0-9]*' input | sed 's/A$/A=0/' | cut -d= -f2

产地:

10
0
30