我正在寻找一种方法来使用一行 Linux 命令(sed 或 awk,或任何其他命令)转换以下文件(example1.txt);
1.2.3.4:21
172.16.1.2:80
192.168.5.4:443
192.168.10.1:7007
变成如下格式:
"1.2.3.4" "21"
"172.16.1.2" "80"
"192.168.5.4" "443"
"192.168.10.1" "7007"
任何帮助都将非常感谢,谢谢。
答案1
您可以使用 AWK 执行如下操作。
awk -F ':' -v q='"' '{print q $1 q " " q $2 q}' example1.txt
-F
定义字段分隔符。这就是它将两列分成$1
和 的方式$2
。
-v
帮助我们定义一个变量,它是q
。q
包含双引号。
" "
此处的额外空间为打印件之间提供了空间。
打印第一个字段:
$ awk -F ':' '{print $1}' example1.txt 1.2.3.4 172.16.1.2 192.168.5.4 192.168.10.1
打印第二列
$ awk -F ':' '{print $1 $2}' example1.txt 1.2.3.421 172.16.1.280 192.168.5.4443 192.168.10.17007
添加其间的空格。
$ awk -F ':' '{print $1 " " $2}' example1.txt 1.2.3.4 21 172.16.1.2 80 192.168.5.4 443 192.168.10.1 7007
添加双引号。
$ awk -F ':' -v q='"' '{print q $1 q " " q $2 q}' example1.txt "1.2.3.4" "21" "172.16.1.2" "80" "192.168.5.4" "443" "192.168.10.1" "7007"
上述命令只会打印它。如果您想将其保存到文件中,可以运行以下命令。
$ awk -F ':' -v q='"' '{print q $1 q " " q $2 q}' example1.txt > example2.txt
$ cat example2.txt
"1.2.3.4" "21"
"172.16.1.2" "80"
"192.168.5.4" "443"
"192.168.10.1" "7007"
此外,以下命令也可以给您相同的结果。
$ awk -F':' '{print "\""$1"\""" ""\""$2"\""}' example1.txt
"1.2.3.4" "21"
"172.16.1.2" "80"
"192.168.5.4" "443"
"192.168.10.1" "7007"
答案2
当所有 sed 命令都可以连接成一个时,就无需使用多个 sed 命令:
sed 's/^/"/; s/:/" "/; s/$/"/' input.txt
使用 awk:
awk '{sub("^","\"");sub(":","\" \"");sub("$","\"");print}' input.txt
答案3
使用 Sed
sed 's/\(.*\):\(.*\)/"\1" "\2"/'
使用 Bash
while IFS=: read addr port; do echo \"$addr\" \"$port\"; done
甚至
while read line; do echo \"${line/:/'" "'}\"; done
答案4
使用 Miller (https://github.com/johnkerl/miller)并运行
mlr --csv --quote-all -N --ifs ":" --ofs " " cat input.csv
你有
"1.2.3.4" "21"
"172.16.1.2" "80"
"192.168.5.4" "443"
"192.168.10.1" "7007"