我有这个文本文件:
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
。我怎么能做到这一点?
答案 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