来自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

我使用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'[][ \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”“}

    读取所有行后,打印换行符

创建shell变量 例如,如果文件输入包含您的数据:

$ 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)$