在shell脚本中,我可以在cut中指定多个输出分隔符吗?

时间:2016-07-22 19:40:34

标签: bash shell command sh

我有一个包含以下数据的文件

  

ABCDEFGHIJKLMNOPQRST

我需要使用命令cut作为以下

输出
  

BCD | klm.no | pq.rst

我需要使用剪切功能在输出中包含分隔符|.

我使用此代码

获得了带有一个分隔符的输出
cat file.txt |cut -c2-4,11-13,14-15,16-17,18-20 --output-delimiter='|'

as

  

BCD | KLM |没有| PQ | RST

我可以通过更改命令中的内容来获得2个输出分隔符吗?

3 个答案:

答案 0 :(得分:2)

cut一次只支持一个分隔符,但您可以使用简单的sed或Awk脚本轻松替换它。

awk '{ print substr($0, 2, 4) "|" substr($0, 11, 13) "."
   substr($0, 14, 15) "|" substr($0, 16, 17) "."
    substr($0,18, 20) }' file.txt

巧合的是cat is useless

答案 1 :(得分:1)

使用GNU sed:

$ sed -r 's/.(.{3}).{6}(.{3})(.{2})(.{2})/\1|\2.\3|\4./' file.txt
bcd|klm.no|pq.rst

答案 2 :(得分:1)

两个cut(由 Gilez 建议&OP评论给OP):

cut -c2-4,11-15,16-20 --output-delimiter='|' file.txt | \
cut -c1-7,8-13,14-15  --output-delimiter='.'

输出:

bcd|klm.no|pqr.st

如果有这样的定期输入,tr也可以回答"这没有管道:

tr -s 'a-t' 'b-d|k-m.no|p-r.st' < file.txt

注意:tr无法插入,因此听起来不可能。通常 是不可能的,但作弊是在 SET2 中包含答案,并挤出其余部分。