提取以分號分隔的地址並在一行中列印每個地址

提取以分號分隔的地址並在一行中列印每個地址

我有一個包含以下輸入的文件。用點分隔的數字代表位址。地址中的任何數字都可以是一位或多位數字,如下所示:

[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

擴展正規表示式-Eegrep)不知道\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 正規表示式-Ppgrep):

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部分刪除重複的地址。

相關內容