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 sedtr

$ 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中的数字导致一行的主要内容,如果未能解决你的问题,请参考以下文章

片段中的getView()导致抛出异常,不确定原因

linux grep 找字符串有空格的

用 grep 匹配一行中的两个字符串

有没有办法在nodejs pdfkit中使一行中的文本片段变为粗体?

grep命令保留第一行(C语言实现)

片段中的Android Studio RecyclerView [重复]