如何为在一行中多次出现的正则表达式创建 grep

ran*_*ame 6 grep sed regular-expression

我想 grep 一个正则表达式。我正在搜索的模式可能会在一行中出现多次。如果该模式出现多次,我想用逗号分隔每次出现的情况,并仅在新文件中打印匹配项而不是整行。如果它没有出现在一行中我想打印na

例子。我想使用这个正则表达式来查找模式中的数字:[12.123.1.3]。

grep -oh "\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]" 'filename'
Run Code Online (Sandbox Code Playgroud)

输入文件(input.txt)

blabla [11.335.2.33] xyuoeretrete [43.22.11.88] jfdfjkfbs [55.66.77.88]
blabla [66.223.44.33]
foo bar
blabla [1.2.33.3] xyuoeretrete [42] bla[1.32.2.4]
Run Code Online (Sandbox Code Playgroud)

新文件(output.csv)中的预期结果:

11.335.2.33,43.22.11.88,55.66.77.88
66.223.44.33
n.a.
1.2.33.3,1.32.2.4
Run Code Online (Sandbox Code Playgroud)

注:我使用Ubuntu

αғs*_*нιη 3

使用 GNU awk 进行 FPAT:

awk -v FPAT='\\[([0-9]{1,3}[.]){3}[0-9]{1,3}\\]' -v OFS=, '
{
    $1=$1; print (gsub(/[][]/, "")?$0:"N/A")
}' <infile >output
Run Code Online (Sandbox Code Playgroud)

或使用任何 POSIX awk(都支持{x,y}RE 间隔):

awk '
{
    bkup=$0;
    gsub(/\[([0-9]{1,3}[.]){3}[0-9]{1,3}\]/, "|")
    gsub(/[][()\\.{}?+*$^]/, "\\\\&")
    n=split(bkup, tmp, $0)
    for(i=1; i<=n; i++){
        if(tmp[i]!=""){
            gsub(/[][]/, "", tmp[i])
            printf ("%s", (sep?",":"") tmp[i])
            sep=","
        }
    }; print (sep?"":"N/A"); sep=""
}' <infile >output
Run Code Online (Sandbox Code Playgroud)

输出被写入文件中output

$ cat output
11.335.2.33,43.22.11.88,55.66.77.88
66.223.44.33
N/A
1.2.33.3,1.32.2.4
Run Code Online (Sandbox Code Playgroud)

请注意,对于第二种方法,您的输入不应包含|和字符。&


带有内联解释的相同代码:

$ cat output
11.335.2.33,43.22.11.88,55.66.77.88
66.223.44.33
N/A
1.2.33.3,1.32.2.4
Run Code Online (Sandbox Code Playgroud)