【问题标题】:Bash - how to put each line within quotationBash - 如何将每一行放在引号内
【发布时间】:2013-06-07 19:18:22
【问题描述】:

我想将每一行放在引号内,例如:

abcdefg
hijklmn
opqrst

转换为:

"abcdefg"
"hijklmn"
"opqrst"

如何在 Bash shell 脚本中执行此操作?

【问题讨论】:

  • 欢迎来到 Stack Overflow。请尽快阅读FAQ。你的问题还不错,但它是模棱两可的,或者可能只是有点不完整。这些行来自哪里——来自文件、变量数组或单个变量(或其他地方)中的行?输出需要去哪里?进入变量、数组、文件或其他地方?到目前为止的答案显示了各种可能性(并没有涵盖我提到的所有场景)。
  • 另外,很多人似乎出于错误的原因想要这样做。如果您有一个程序要求其参数用引号括起来,例如./tool "example sentence one" "example sentence two",则引号由 shell 使用,而不是数据本身的一部分。如果变量中有这些值,则变量不应包含引号,但您需要引用插值; ./tool "$sentence1" "$sentence2"

标签: regex linux bash shell


【解决方案1】:

使用 awk

awk '{ print "\""$0"\""}' inputfile

使用 纯 bash

while read FOO; do
   echo -e "\"$FOO\""
done < inputfile

inputfile 是一个包含不带引号的行的文件。

如果您的文件有空行,awk 绝对是最佳选择:

awk 'NF { print "\""$0"\""}' inputfile

NF 告诉awk 仅在字段数大于零(行不为空)时执行打印命令。

【讨论】:

  • 对于read 解决方案,您需要IFS= read -r FOO。否则你会在行首丢失空格,反斜杠转义我会丢失
  • 或者丢失FOO 并使用隐含的$REPLY 名称。就做while read; do printf '"%s"\n' "$REPLY"; done &lt; inputfile
  • 我所看到的更多使用awk的理由:D
  • @glennjackman 当然,如果你真的想保留反斜杠转义。
  • s/line is not empty/line is not blank/。请注意,-e 不是必需的,如果它包含反斜杠,它实际上会改变内容。
【解决方案2】:

这个 sed 也可以忽略空行:

sed -i.bak 's/^..*$/"&"/' inFile

sed 's/^.\{1,\}$/"&"/' inFile

【讨论】:

    【解决方案3】:

    我使用以下命令:

    xargs -I{lin} echo \"{lin}\" < your_filename
    

    xargs 接受标准输入(从您的文件重定向)并一次将一行传递给 {lin} 占位符,然后在下一个执行命令,在本例中为带有转义双引号的 echo

    您可以使用 xargs 的 -i 选项省略占位符的名称,如下所示:

    xargs -i echo \"{}\" < your_filename
    

    在这两种情况下,您的 IFS 必须为默认值或至少为 '\n'

    【讨论】:

    • 还要考虑一下,可能并不真的需要回显该事物,但可能需要引号来执行脚本中的其他操作。对我来说,我可以运行一个命令:script-that-lists-files-per-line.py | xargs -I{lin} sudo chmod a+r {lin}
    • 你是对的 macetw 先生,我的错误没有说清楚,这只是一个命令示例。
    • 在 Windows 10 上使用 mingw xargs 4.4.2 从命令提示符发现 >xargs -I{lin} echo "'"lin"'" 适用于单引号。
    【解决方案4】:

    使用 sed:

    sed -e 's/^\|$/"/g' file
    

    如果文件包含空行,则需要更多的努力。

    【讨论】:

    • 我试过了,发现由于某种原因,在空白行上它只输出一个引号。
    • 可以sed 's/.*/"&amp;"/'
    • @glennjackman:是的。如果该行为空,则只有一个位置可以尝试替换。
    • sed 's/^/"/; s/$/"/' 文件,假设没有行被引用。
    【解决方案5】:

    我认为 sed 和 awk 是最好的解决方案,但如果你只想使用 shell,这里是适合你的小脚本。

    #!/bin/bash
    
    chr="\""
    file="file.txt"
    cp $file $file."_backup"
    while read -r line
    do
     echo "${chr}$line${chr}"
    done <$file > newfile
    mv newfile $file
    

    【讨论】:

    • 最好至少提供一些解释,说明您为什么认为这是不正确的。
    • 除了显示如何输出文字双引号外,它根本没有解决在预先存在的文本中添加引号的主题。
    • @chepner 我已经修改了我的评论,感谢您给我反馈,以便我可以更有效地做出贡献。
    【解决方案6】:
    paste -d\" /dev/null your-file /dev/null
    

    (不是最好看,但可能是最快的)

    现在,如果输入可能包含引号,您可能需要使用反斜杠转义它们(然后也转义反斜杠),例如:

    sed 's/["\]/\\&/g; s/.*/"&"/' your-file
    

    【讨论】:

    • 我很欣赏这个解决方案,因为它只需要我在嵌入命令时转义一个单引号,我需要将每个转义为\\\"
    【解决方案7】:

    我使用 sed 和两个表达式来替换行首和行尾,因为在我的特定用例中,我希望仅在包含特定单词的行周围放置 HTML 标记。

    所以我在文本文件inputfile 中搜索了包含bla 变量中的单词的行,并用&lt;P&gt; 替换了开头,用&lt;/P&gt; 替换了结尾(实际上我做了一些更长的HTML 标记真实的东西,但这可以作为示例)

    类似于:

    $ bla=foo
    $ sed -e "/${bla}/s#^#<P>#" -e "/${bla}/s#\$#</P>#" inputfile
    <P>foo</P>
    bar
    $
    

    【讨论】:

      【解决方案8】:

      这个answermac terminal 为我工作。

      $ awk '{ printf "\"%s\",\n", $0 }' your_file_name
      

      需要注意的是,双引号逗号中的文本是终端打印出来的,文件本身不受影响。 p>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-21
        • 2019-02-16
        • 2015-11-14
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 2017-06-19
        相关资源
        最近更新 更多