我有一个cities
这样的文件:
[1598] San Diego, US (inactive)
[4517] St Louis, US (inactive)
[6346] Orlando, US (inactive)
Run Code Online (Sandbox Code Playgroud)
我想删除城市名称,以便我有:
San Diego
St Louis
Orlando
Run Code Online (Sandbox Code Playgroud)
这是我能想到的最好的:
cut -d ',' -f1 cities | cut -d ']' -f2
Run Code Online (Sandbox Code Playgroud)
但这仍然给我留下了名字前的空格。是否有一个cut
类似的命令,我可以使用它接受几个字符的分隔符,以便我可以继续]
?
aso*_*ove 15
Awk(另请参阅 Awk Info)对这类问题很漂亮。尝试:
awk -F'[],] *' '{print $2}' cities
Run Code Online (Sandbox Code Playgroud)
这将字段分隔符定义-F
为[],] *
- 这意味着出现一次右方括号或逗号,后跟零或任意数量的空格。当然,您可以更改它以适应任何要求。阅读正则表达式。
分割线后,您可以对分割结果进行任何操作。在这里,我决定只用print $2
. 请注意,在 awk 指令周围使用单引号很重要,否则 $2 将被 shell 替换。
Jul*_*ano 12
对于更复杂的解析,您应该使用sed(1):
sed -e 's/\[[0-9]\+\] \([^,]\+\),.*/\1/' cities
Run Code Online (Sandbox Code Playgroud)
或者-r
按照pepoluan 的建议使用来简化正则表达式:
sed -re 's/\[[0-9]+\] ([^,]+),.*/\1/' cities
Run Code Online (Sandbox Code Playgroud)
Bar*_*run 12
您可以cut
将管道中的最后一个修改为:
cut -d ' ' -f2-
Run Code Online (Sandbox Code Playgroud)
上面的意思是字段分隔符是空格,我们要选择从第二个开始的所有字段。完整的序列变为:
cut -d ',' -f1 cities | cut -d ' ' -f2-
Run Code Online (Sandbox Code Playgroud)