【问题标题】:Use sed to delete all leading/following blank spaces in a text file使用 sed 删除文本文件中的所有前导/后续空格
【发布时间】:2010-12-08 06:20:48
【问题描述】:

文件1:

  hello  
  world  

如何使用 sed 删除此文件中的前导/尾随空格 - 使用一个命令(无中间文件)

我目前有:

sed -e 's/^[ \t]*//' a > b

用于前导空格。

sed 's/ *$//' b > c

这用于尾随空格。

【问题讨论】:

  • 根据您的问题,虽然@ghostdog74 的回答很好,但@mouviciel 的回答是正确 的。我对两者都投了赞成票,但我相信 @mouviciel 值得被接受为正确答案。
  • 你是对的 - mouviciel 现在被接受了。感谢 mouviciel(正确答案)和 ghostdog74(到 awk 的方向)的时间!

标签: linux unix text sed


【解决方案1】:

你几乎明白了:

sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c

此外,在sed 的某些风格上,还有一个用于编辑内联的选项:

sed -i -e 's/^[ \t]*//;s/[ \t]*$//' a

【讨论】:

  • 我也会考虑匹配\s,这是通用的“所有空白字符”。
  • 不应该是sed -e 's/^[ \t]*//;s/[ \t]*$//' a > c吗?
  • 我仍然看到 sed -e 's/^[ \t]*//;s/[ \t]*$/' a > c 对我不起作用(bash 版本 4.3.30,Funtoo-Linux)。
  • @NikosAlexandris - 谢谢,现在我看到了缺少的斜杠。固定。
【解决方案2】:

更简单的方法,使用 awk

awk '{$1=$1}1' file

awk '{gsub(/^ +|  +$/,"")}1' file

【讨论】:

  • 第一个完美运行并且是最简单的 - 我知道它不是我所要求的(即 sed) - 但它是如此优雅:)。我现在将研究 awk。
  • 第一个删除所有虚假空格,不仅是前导和尾随。第二个效果最好。 awk 是一个很棒的工具。
  • 啊,我看到第一个空格现在被删除了 - 第二个空格没有额外删除。
【解决方案3】:
perl -lape 's/^\s+|\s+$//g'

老实说,我最了解 perl 正则表达式,所以我发现 perl -lapesed -e 更易于使用。

另外,要回答原始问题,您可以让 sed 执行多个操作,如下所示:

sed -e 's/something/something else/' -e 's/another substitution/another replacement/'

显然,您也可以将两个替换项放在一个字符串中,并用分号分隔它们,如另一个答案所示。

【讨论】:

    【解决方案4】:

    请注意,在不使用中间文件的情况下对输入文件连续应用多个过滤器的更一般情况下,解决方案是使用管道:

    sed -e 's/^[ \t]*//' a | sed -e 's/ *$//' > c
    

    显然这里不需要它们,因为调用一次 sed 就足够了,但是如果第二个 sed 命令是不同的,比如 uniq 或 sort,那么这个模式是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-29
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多