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
使用 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)