在Unix的cut命令中,是否可以使用字符串作为分隔符?

24
如果我想使用字符串作为分隔符来切割一组文本,这是否可能?例如,我有一个目录,在该目录中,一组shell脚本调用相同的perl脚本。
abc.pl

所以当我执行


$grep abc.pl * 

在那个目录下,它给我以下结果。
xyz.sh: abc.pl 1 2
xyz2.sh: abc.pl 2
mno.sh: abc.pl 3
pqr.sh: abc.pl 4 5

我基本上想要在"abc.pl"之后的所有输出(以检查现在传递给perl的范围参数为何)

当我尝试时

$grep abc.pl * | cut -d'abc.pl' -f2

或者

$grep abc.pl * | cut -d'abc\.pl' -f2

它给我

cut: invalid delimiter

当我读到“man for cut”时,它说明:

分隔符可以是多字节字符。

这里我做错了什么或解释错误了吗?


它给了我以下结果xyz.sh: abc.pl 1 2 xyz2.sh: abc.pl 2 mno.sh: abc.pl 3 pqr.sh: abc.pl 4 5...当我尝试 $grep abc.pl * | cut -d'abc.pl' -f2 或者 $grep abc.pl * | cut -d'abc.pl' -f2 它会给我一个cut: invalid delimiter的错误。 - Devang Kamdar
抱歉 :( 不确定为什么它没有显示输入的换行符 :( - Devang Kamdar
你的意思是那些没有任何使用示例的 man 手册没有让人明白吗? - Chance
5个回答

35

尝试使用这个。

$grep abc.pl * | awk -F 'abc.pl' '{print $2}'

-F fs --field-separator fs 用于输入字段分隔符的 fs(预定义变量 FS 的值)。


11

当我阅读cut的man页时,它指出...分隔符可以是多字节字符。

多字节字符,但只有一个字符,而不是字符串。

canti:~$ ll | cut --delimiter="delim" -f 1,2
cut: the delimiter must be a single character
Try `cut --help' for more information.

canti:~$ cut --version  
cut (GNU coreutils) 5.97

您可以仅将输出分隔符指定为字符串(在这种情况下无用):

 --output-delimiter=STRING                                                          
        use STRING as the output delimiter the default is to use the input delimiter

7
为什么不使用 grep abc.pl | awk '{print $3, $4}'

并不是以我期望的方式工作,它只显示了部分列表... 我也很好奇我使用 cut 的方式有什么问题? - Devang Kamdar
我实际上从来没有使用过cut。你的任务需要awk或perl! - alamar
太酷了...谢谢alamar...不过我要把正确答案给予Alex的回复,因为他真正回答了我所寻找的内容。我希望有一种方法可以选择两个答案...但那样会引起很多其他问题。所以感谢你的帮助。非常感激 :) - Devang Kamdar
没问题,我并不在意那个评分的事情。 - alamar
好知道...但如果其他人寻找相同问题的答案,阅读两篇帖子将给出完整的解决方案。无论如何...假设如果他们在查看第一篇帖子后没有解决问题,他们也会查看其他回复 :) - Devang Kamdar

0

或者你可以尝试使用 Ruby:

grep abc.pl * | ruby -ne 'p $_.chomp.split("abc.pl").last'

-1

$ grep abc.pl * | cut -d' ' -f3-999

在这种情况下,只需使用空格字符作为分隔符即可。


1
不需要包含999 - 只需执行cut -d' ' -f3- - We Are All Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接