【问题标题】:Add at the end of the line with sed用 sed 在行尾添加
【发布时间】:2010-03-25 22:48:22
【问题描述】:

给定一个包含几行的纯文本文档,例如:

c48 7.587 7.39
c49 7.508 7.345983
c50 5.8 7.543
c51 8.37454546 7.34

我需要在行尾添加一些信息 2 个空格,所以对于每一行我都会得到:

c48 7.587 7.39  def
c49 7.508 7.345983  def
c50 5.8 7.543  def
c51 8.37454546 7.34  def

我需要为数千个文件执行此操作。我想这可能与sed有关,但不知道该怎么做。有什么提示吗?您能否也给我一些关于这种情况的教程或表格的链接?

谢谢

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    如果所有文件都在一个目录中

    sed -i.bak 's/$/  def/' *.txt
    

    递归(GNU 查找)

    find /path -type f -iname '*.txt' -exec sed -i.bak 's/$/  def/' "{}" +;
    

    sed的介绍可以看here

    你可以使用的其他方式,

    awk

    for file in *
    do
      awk '{print $0" def"}' $file >temp
      mv temp "$file"
    done 
    

    Bash 外壳

    for file in *
    do
      while read -r line
      do
          echo "$line def"
      done < $file >temp
      mv temp $file
    done
    

    【讨论】:

    • +; 是什么?我总是使用\;。 bash 手册页并没有让我变得更聪明。
    • 它在 GNU find's 手册页中。相当于xargs
    • 嗨,awk 很好。只是一个简短的问题,如何将 awk '{print $0" def"}' $file >temp 应用于文件的具体行号?
    • @werner,对于行号,也就是记录号,使用NR,例如awk 'NR==3{..}' file 表示为第3行做
    • 当我做你的第一个选项时,但由于某种原因使用 20 个空格而不是 2 + 'def' 时,它将空格放在下一行。不过,您的 awk 解决方案效果很好!谢谢
    【解决方案2】:
    for file in ${thousands_of_files} ; do
        sed -i ".bak" -e "s/$/  def/" file
    done
    

    这里的关键是搜索和替换s/// 命令。在这里,我们将行尾 $ 替换为 2 个空格和您的字符串。

    http://sed.sourceforge.net/#docs 查找 sed 文档

    【讨论】:

    • 非常感谢。只是一个问题,在OSX上这样做,为什么会出现字符“^M”?
    • IIRC,行尾 - Unix、Mac 和 Windows 中的 EOL 结束字符都是不同的。 sed 是一个 Unix 实用程序,因此它使用 Unix 约定,即以回车 - CR (^M) 结束每一行,而 macs 使用换行 - LF (^L),Windows BTW 使用 CR,LF。关键是你留下了 Unix EOL 字符。我不是 Mac 专家,但应该有一个实用程序来解决这个问题。在我的Linux机器上有dos2unixunix2dos,但是如果找不到这样的工具,请尝试使用tr '\r' '\f'来获得类似的效果。
    • 请注意,Mac 使用 CR (^M) ('\r') 直到 OS X,此时他们切换到 LF (^L) ('\n')。 UNIX 一直使用 LF (^L)。您说 Windows 使用 CRLF (^M^L) ("\r\n") 是正确的。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 2012-03-24
    相关资源
    最近更新 更多