切不切的时候应该用什么?

Kit*_*nde 19 command-line cut

我有一个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 替换。

  • `]` 不是尖括号。尖括号是`<>`。`[]` 是“方括号”,或者只是“括号”。 (2认同)

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)

  • +1。您还可以使用 -r 来防止转义高级正则表达式字符,大大简化了正则表达式模式 (2认同)

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)