![cut -d – 分隔符仍显示在输出中。如何简单去除呢?](https://linux22.com/image/227346/cut%20-d%20%E2%80%93%20%E5%88%86%E9%9A%94%E7%AC%A6%E4%BB%8D%E6%98%BE%E7%A4%BA%E5%9C%A8%E8%BE%93%E5%87%BA%E4%B8%AD%E3%80%82%E5%A6%82%E4%BD%95%E7%AE%80%E5%8D%95%E5%8E%BB%E9%99%A4%E5%91%A2%EF%BC%9F.png)
为什么输出中仍然显示分隔符?我认为字段 2 和 4 将显示为没有-
分隔符。如何使用cut
命令不同时显示用于分隔字段的分隔符本身?
$ curl -s -m 2 https://am.i.mullvad.net/json | jq '.mullvad_exit_ip_hostname'
"nl-ams-wg-002"
$ curl -s -m 2 https://am.i.mullvad.net/json | jq '.mullvad_exit_ip_hostname' | sd '\"' '' | cut -d '-' -f 2,4
ams-002
答案1
不需要sd
(无论是什么)或cut
这里:
curl -s -m 2 https://am.i.mullvad.net/json |
jq -r '.mullvad_exit_ip_hostname|split("-")|.[1]+.[3]'
至于删除分隔符的一般问题,通过 GNU 实现cut
,您可以使用--output-delimiter
带有空分隔符的选项:
$ echo a-b-c-d-e | cut -d- -f 2,4
b-d
$ echo a-b-c-d-e | cut -d- --output-delimiter= -f 2,4
bd
cut
当心输入没有分隔符时的令人惊讶的行为:
$ echo abc | cut -d- -f 2,4
abc
添加该-s
选项将删除非分隔行,即具有 0 或 1 字段的行,而不是那些不具有请求字段的行。
您可以使用awk
而不是cut
获得更大的灵活性(并避免 GNU 主义):
$ echo a-b-c-d | awk -F- '{print $2 $4}'
bd
或者
$ echo a-b-c-d | awk -F- 'NF >= 4 {print $2 $4}'
bd
只打印包含至少 4 个字段的行 1 的内容。
¹ 是的,awk
(默认情况下),就像cut
一次处理每一行,而jq
'ssplit
会将字符串作为一个整体处理,即使它包含换行符。