grep中的数字导致一行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grep中的数字导致一行相关的知识,希望对你有一定的参考价值。
我使用egrep输出一些带有平台名称的行:
XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$"
[30] i686-nptl-linux-gnu
[34] i686-w64-mingw32
[75] x86_64-unknown-linux-gnu
[77] x86_64-w64-mingw32
我需要的是:
export PLATNUMS=30,34,75,77
如何将egrep命令传递给sed / awk / bash脚本?
答案
尝试:
$ command | awk -F'[][ ]+' '/i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/{printf "%s%s",(f?",":"export PLATNUMS="),$2; f=1} END{print""}'
export PLATNUMS=30,34,75,77
这个怎么运作
-F'[][ ]+'
使用任意数量的空格,制表符或[
或]
作为字段分隔符。/i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/
{...}` 对于感兴趣的行,请使用花括号执行命令。printf "%s%s",(f?",":"export PLATNUMS="),$2; f=1
对于感兴趣的线条,打印我们想要的东西。 变量f
标志这是否是第一线。END{print""}
读完所有行后,打印换行符。
Creating a shell variable
export PLATNUMS=$(command | awk -F'[][ ]+' '/i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/{printf "%s%s",(f?",":""),$2; f=1} END{print""}')
例如,如果文件输入包含您的数据:
$ export PLATNUMS=$(awk -F'[][ ]+' '/i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/{printf "%s%s",(f?",":""),$2; f=1} END{print""}' input)
$ declare -p PLATNUMS
declare -x PLATNUMS="30,34,75,77"
对于那些喜欢将命令分散在多行中的人:
export PLATNUMS=$(command | awk -F'[][ ]+' '
/i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$/{
printf "%s%s",(f?",":""),$2
f=1
}
END{
print""
}
')
另一答案
也许这样,我不能尝试你的egrep。
export PLATNUMS=$(XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$" | sed ':A;s/[([[0-9]*)].*/1/;$bB;N;bA;:B;s/
/,/g')
echo $PLATNUMS
这怎么工作?
你的egrep命令返回一个多行文本,所以sed以这种方式逐行读取这个文本
sed '
:A # label A
# here with your example
# on the first line the pattern space look like that
# [30] i686-nptl-linux-gnu
# on the second line the pattern space look like
# 30
# [34] i686-w64-mingw32
s/[([[0-9]*)].*/1/ # substitute all digit enclose by [] by only the digit
# on the first line the pattern space become
# 30
# on the second line the pattern space become
# 30
# 34
# and so on for each line
$bB # on the last line jump to B
N # get a newline in the pattern space
bA # It is not the last line so jump to A
:B # label B
# here we have read all the line
# the pattern space look like that without the #
# 30
# 34
# 75
# 77
s/
/,/g' # subtitute all
by a comma
# the pattern space become
# 30,34,75,77
# $(XXX | egrep .... | sed ...) return 30,34,75,77 in the variable PLATNUMS
# It is better not to use all capital letters in your variable name
另一答案
与GNU sed
和tr
:
$ XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$" | sed -E 's,]s+.+$,,g' | sed 's,^[,,g' | tr '
' ',' | sed -E 's,(^.+$),export PLATNUMS=1,' | sed 's/,$//' && echo
我不确定你想要实现什么,但你可能想要自动eval
输出export
:
$ eval $(XXX | egrep "i686-nptl-linux-gnu$|i686-w64-mingw32$|x86_64-unknown-linux-gnu$|x86_64-w64-mingw32$" | sed -E 's,]s+.+$,,g' | sed 's,^[,,g' | tr '
' ',' | sed -E 's,(^.+$),export PLATNUMS=1,' | sed 's/,$//' && echo)
$ echo $PLATNUMS
30,34,75,77
另一答案
如果你认为你需要grep + sed或2 greps或2 seds或任何其他组合,那么你应该使用1来调用awk,当你使用awk时你永远不需要grep或sed:
export PLATNUMS=$(XXX | awk -F'[][]' '/(i686-nptl-linux-gnu|i686-w64-mingw32|x86_64-unknown-linux-gnu|x86_64-w64-mingw32)$/{p=(p ? p "," : "") $2} END{print p}')
顺便说一下,如果它有用,这里有几个简短的正则表达式:
(i686-(nptl-linux-gnu|w64-mingw32)|x86_64-(unknown-linux-gnu|w64-mingw32))$
((i686-nptl|x86_64-unknown)-linux-gnu|(i686|x86_64)-w64-mingw32)$
并且根据您的输入数据(因为这将包括上面未提供的组合),您可能只需要:
(i686|x86_64)-(nptl|unknown|w64)-(linux-gnu|mingw32)$
以上是关于grep中的数字导致一行的主要内容,如果未能解决你的问题,请参考以下文章