【发布时间】:2013-07-05 11:26:44
【问题描述】:
我有一个由{##} 分隔的文件。我试过了:
$ cat infile | cut -d" {##} " -f1 | grep -w "word"
但我无法正确使用 cut 命令。如何转义特殊字符(例如 cut 中的 !@#$%^&*(){}[]?
【问题讨论】:
我有一个由{##} 分隔的文件。我试过了:
$ cat infile | cut -d" {##} " -f1 | grep -w "word"
但我无法正确使用 cut 命令。如何转义特殊字符(例如 cut 中的 !@#$%^&*(){}[]?
【问题讨论】:
首先cut 需要单字符分隔符(-d 选项)。所以字符串不起作用,您需要其他工具来准备输入,让我们使用sed。
其次,您应该使用单引号 ' 而不是双引号 ",这样它就不会被 shell 解释。
如果我们可以使用| 作为分隔符,这将起作用。
cat infile | sed 's/ {##} /|/g' | cut -d'|' -f1 | grep -w 'word'
您可以将分隔符| 替换为输入文件中从不出现的字符。
您可以通过在它们前面加上反斜杠 \ 或将它们放在不被解释的单引号 ' 中来转义 shell 字符。
【讨论】:
awk 也可以使用多字符分隔符:
awk -F ' {##} ' '$1 ~ /\<word\>/ {print $1}' infile
【讨论】:
使用下面的命令代替 cut 和 grep:
perl -F"{##}" -lane 'print $F[0] if($F[0]=~/\bword\b/)' infile
【讨论】:
-F' {##} '?
/\bword\b/与grep -w对应
perl,但我必须通过从python 调用bash 命令来作弊,所以使用python 调用perl 似乎很奇怪。不过,我必须说迭代在 perl 上运行得更快 =)