来自egrep的数字产生一行
我使用egrep输出一些带有平台名称的行:来自egrep的数字产生一行,grep,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
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'[][ \t]+' '/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'[\t]+'
或[
作为字段分隔符]
{…}` 对于感兴趣的行,请在大括号中执行命令/i686 nptl linux gnu$| i686-w64-mingw32$| x86_64-unknown-linux-gnu$| x86_64-w64-mingw32$/
对于感兴趣的行,打印我们想要的内容 变量printf“%s%s”,(f?”,“:“导出平台=”),$2;f=1
标记这是否是感兴趣的第一行f
读取所有行后,打印换行符END{print”“}
$ export PLATNUMS=$(awk -F'[][ \t]+' '/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'[][ \t]+' '
/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""
}
')
使用
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 '\n' ',' | 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 '\n' ',' | sed -E 's,(^.+$),export PLATNUMS=\1,' | sed 's/,$//' && echo)
$ echo $PLATNUMS
30,34,75,77
也许这样,我不能试着用你的白鹭
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/\n/,/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/\n/,/g' # subtitute all \n 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
如果您曾经认为您需要grep+sed或2个grep或2个sed或任何其他组合,那么您应该使用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)$
这打印了结果,但它不是一个真正的导出-我这样做:
导出平台=$(XXX | awk-F'[\t]+''/i686 nptl linux gnu$;i686-w64-mingw32$;x86-unknown-linux-gnu$;x86-u 64-w64-mingw32$/{printf“%s%s”,“F?”,“:”,$2;F=1})
@bais感谢您的澄清。你的代码看起来很好!我刚刚在答案中添加了创建和导出shell变量的代码。它也可以工作-我不可读,但它非常紧凑-太棒了!
(i686|x86_64)-(nptl|unknown|w64)-(linux-gnu|mingw32)$