【问题标题】:Simplest way to replace (\n) with (" ") in bash?在bash中用(“”)替换(\ n)的最简单方法?
【发布时间】:2021-11-14 19:48:14
【问题描述】:

在纯文本文件中,我试图从中获取

 Item 1
 Item 2

 "Item 1" "Item 2"

我尝试使用tr 命令(cat FILE.txt | tr "\n" "\" \""), 但这没有用。
我也尝试过使用cat FILE.txt | tr '\n' '\" \"',但同样无济于事。

谁能帮我做?


另外,作为附加问题,获得第一个双引号的最简单方法是什么?
用我的方法,如果我让它发挥作用,我最终会得到:

Item 1" "Item 2"

附:感谢 Jorengarenar 帮助我进行编辑。

【问题讨论】:

  • 还要确保确实存在 \n 而不是 \r\n (Windows) 或 \r (Mac)。
  • 谢谢。它是一个实际的 \n,例如,如果我运行命令 (tr "\n" " "),它将用空格替换新行。当然,括号只是为了突出显示代码。
  • @I.P 要明确:您的意思是实际的换行符,而不是反斜杠后跟字母“n”,对吧?
  • 好吧,在文本文档中,这些只是换行符,正如人们所期望的那样。但是,当我运行代码时,我使用的是反斜杠,后跟字母 n。这确实有效。
  • @I.P 某些程序,例如tr,至少在某些情况下会将\n 转换为换行符;但最好明确一点,虽然\n 在某些情况下可能用于表示换行符,但它实际上并不是换行符。

标签: linux bash sed


【解决方案1】:

或利用 awk

[gmn]awk -v RS='^$' 'gsub(/^|\n$/,"\"")+gsub(/\n/,"\" \"")'

[gmn]awk -v RS='' 'gsub(/^|\n?$/,"\"")+gsub(/\n/,"\" \"")'

不像我希望的那样优雅

第三个版本感觉更优雅,但在尾部增加了一个空间:

[gmn]awk -v ORS=' ' 'gsub(/^|$/,"\"")'

这可以通过一个额外的 sed 来纠正,这会破坏优雅:

[gmn]awk -v ORS=' ' 'gsub(/^|$/,"\"")' | gsed -z 's/.$//'

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU utils):

    sed 's/.*/"&"/' file | paste -sd\  
    

    或:

    sed 's/.*/\\"&\\"/' file | xargs
    

    注意paste 中的-d 选项是一个反斜杠,后跟一个空格作为分隔符。

    【讨论】:

      【解决方案3】:

      分两步: 1.cat FILE.txt | tr '\n' ' ' 2.sed -E 's:([a-zA-Z0-9]+):"\1":g' FILE.txt

      【讨论】:

      • 似乎也很有趣。谢谢。
      • 忘记在 sed 中提及 -i 标志用于内联编辑 FILE.txt :)
      【解决方案4】:

      如果您想更改文件本身,使用ed 的一种方法:

      ed -s file.txt <<'EOF'
      1,$ s/^/"/
      1,$ s/$/" /
      1,$ j
      w
      EOF
      

      首先在每行的开头添加双引号,然后在末尾添加双引号和空格,最后j将所有行合二为一,w将更改后的文件写入磁盘。

      【讨论】:

      • 感谢工作也很好:) 为自己制作了一个小脚本,以备将来使用。 :) 非常感谢大家。
      【解决方案5】:

      试试这个:

      awk '{printf spacer "\"" $0 "\""; spacer=" "} END {print ""}' FILE.txt
      

      解释:对于每一行,这将打印一个分隔符(最初为空)、一个文字双引号、原始行(不包括其终止换行符)和另一个文字双引号。然后,它将spacer 设置为一个空格,这样除了第一行之外的所有行都会在它之前打印一个空格。 printf 不添加换行符,因此所有这些都打印为一条长行。但最后,我们需要添加一个最终换行符,由普通的print 处理。

      【讨论】:

        【解决方案6】:

        一种可能是使用 awk。

        awk '{ printf " " "\""$0"\"" }' FILE
        

        对于附加问题,只需删除 $0 变量后的第二个引号。

        awk '{ printf " " "\""$0"" }' FILE
        

        如果您想要另一个分隔符,您可以将第一个参数更改为您喜欢的任何内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-14
          • 2022-11-01
          • 2010-09-13
          • 1970-01-01
          • 2011-01-24
          • 2012-09-19
          • 1970-01-01
          • 2022-12-17
          相关资源
          最近更新 更多