【问题标题】:How to wrap output lines in quotes in bash?如何在bash中将输出行用引号括起来?
【发布时间】:2016-08-03 19:49:35
【问题描述】:

基本上我想要在this question 中执行逆运算。

我正在运行搜索,寻找具有 Windows 行结尾 (\r\n) 的文件,因为我想要 remove them

$ grep -URl ^M .

一些返回的文件名称中有空格:

./file name 1.txt
./file name 2.txt

为了通过xargs 将其传递给另一个工具,我需要引用这些行。我怎样才能转换成这个输出:

"./file name 1.txt"
"./file name 2.txt"

【问题讨论】:

标签: bash command-line


【解决方案1】:

BSD grep 提供了一个 --null 选项来打印名称后跟一个空字节(而不是换行符)。

GNU grep 提供具有相同语义的 -Z--null 选项。

BSD 和 GNU xargs 都采用 -0 选项来指示文件名由空字节分隔。

因此:

grep -URl --null ^M . | xargs -0 ...

【讨论】:

  • 这在这种特定情况下工作得很好,因为它避免了中间引用的表示。不过,我仍然很好奇你是如何产生这种引用形式的。
  • 请注意,xargs 不会注意名称中的引号,并且会在空白处拆分,除非您使用 -0。如果您要在 for file in $(grep -URl ...) 类型构造中使用输出,则必须努力工作。当文件名中的空格被规避为通过重命名文件来修复的错误时(例如,早在 80 年代),生活会轻松得多。您可能希望使用单引号而不是双引号,否则您可能会遇到嵌入在文件名中的符号问题,例如 $(...)。文件名中的换行符也有点问题。
【解决方案2】:

为了避免空格问题,我会使用换行符作为带有 -d 选项的 xargs 的分隔符:

xargs -d '\n' ...

所以我的解决方案是:

grep -URl ^M . | xargs -d '\n' rm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-27
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2010-09-12
    • 2017-01-29
    • 2010-10-18
    相关资源
    最近更新 更多