我有一个包含以下输入的文件。用点分隔的数字代表地址。地址中的任何数字都可以是一位或多位数字,如下所示:
[112.112.112.112;3.3.3.3;44.44.44.44]
[6.6.6.6;17.17.17.17;88.88.88.88]
我想提取不带分号和括号的每个地址(地址由分号分隔;
),并将每个地址插入新文件中的一行中以生成以下输出:
112.112.112.112
3.3.3.3
44.44.44.44
6.6.6.6
17.17.17.17
88.88.88.88
第一步,我尝试 grep 提取地址,如下所示:
grep -E '\d+\.\d+\.\d+\.\d+' myfile.txt > newfile.txt
但它不打印任何内容。
答案1
扩展正则表达式(-E
或egrep
)不知道\d
。-P
按照 @Alexander 的建议使用或-E
与[0-9]
或[[:digit:]]
一起使用。
添加-o
仅选择匹配项而不是整个匹配行。这也将把单个匹配分解成新的行。
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt
或者
grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt
使用Perl 正则表达式(-P
或者pgrep
):
grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt
如果您更改+
为*
也可以使用基本正则表达式:
grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt
答案2
替换-E
为-P
并添加-o
:
grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt
答案3
使用awk
:
awk 'NF' RS='[][;]' infile
或者tr
如果您不介意第一个空行:
tr -s '];[' '\n' <infile
答案4
grep
对于这项任务来说有点矫枉过正。tr
足够了:
$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u
该sort -u
部分删除重复的地址。