【问题标题】:Replace tab for newline and remove newlines together with SED用 SED 替换换行符并删除换行符
【发布时间】:2018-01-21 06:18:56
【问题描述】:

这些词之间有制表符(五个):

cat dog

我想要这个输出:

猫
狗

我试过这个:sed 's/\t/\n/g; /^$/d' pets 并且输出与sed 's/\t/\n/g' pets 相同:

猫




狗

我必须执行 sed 两次才能得到我想要的。在sed '/^$/d' temp之后像这样sed 's/\t/\n/g' pets>temp

有没有办法通过一个命令获得所需的输出?

【问题讨论】:

  • sed 's/[\t][\t]*/\n/g' ?您可以消除 character class 表示法(例如 [],但它们清楚地表明您正在处理字符。这取决于您。sed 's/\t\t*/\n/g' 是等效的。
  • xargs -n1 可能也适合,所有非空格字符序列将显示在单独的行中

标签: bash sed


【解决方案1】:

继续我的评论。 sed 's/\t/\n/g 的问题是您将 each '\t' 替换为 '\n'。您想用 single 换行符替换 sequence 选项卡。为此,您需要:

sed 's/\t\t*/\n/g'

或者,如果您喜欢在 [ ] 中明确包含 '\t',也可以。

表达式'\t' 匹配单个制表符,当其后跟'\t\t*' 时,它匹配一个制表符和后面的零个或多个制表符序列替换为单个制表符'\n',得到你想要的输出:

cat
dog

末尾的g(全局)只会用一个换行符替换每个序列,例如

"cat     dog           fish" 

(由制表符分隔),变为

cat
dog
fish

如果您有任何问题,请告诉我。

【讨论】:

    【解决方案2】:

    如果制表符的数量很重要,BRE 将允许您通过转义花括号来指定边界,如下所示:

    $ sed $'s/\t\{5\}/\\\n/' <<<$'one\t\t\t\t\ttwo'
    one
    two
    

    请注意,您没有指定操作系统,因此不知道您是否使用 GNU sed,它可以让您在正则表达式中包含 \t 之类的内容。 (我使用 FreeBSD 和 macOS,其中 sed 没有此功能。)但是您已经提到您正在使用 bash,它支持 "format expansion"。您可以使用此 bash 功能在脚本中插入“文字”特殊字符。

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 2016-10-29
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-11
      • 2021-06-21
      • 2020-05-29
      相关资源
      最近更新 更多