【问题标题】:Unix Shell - Removing special newline charactersUnix Shell - 删除特殊的换行符
【发布时间】:2014-01-10 05:49:04
【问题描述】:

我们正在接收一个文件,该文件由 \(newline) 分隔为行和由 \(tab) 字符分隔的列。

当文件的“字段”之一中存在手动换行符时,它会以带有两个反斜杠 (\\newline) 的特殊换行符形式出现。

要删除特殊标签\(tab),我们使用这个sed命令,它可以正常工作:

sed "s/$(printf '\\\\\t')/ /g"

换行符的相应命令,但是没有:

sed "s/$(printf '\\\\\n')/ /g" 

它不会删除 \n,只会删除它之前的反斜杠。是否需要进行特殊处理才能删除 \(newline)?

澄清:普通换行符的格式如下:

\(newline)

而需要删除的特殊字符是

\\(newline)

【问题讨论】:

  • 文件的行中是否有字符串“\\n”,或者反斜杠后确实有换行符(将单行数据分成两行)。
  • 我相信它实际上是`\\(newline char)'
  • 它显示为两行:第一行以 \ 结尾,然后是下一行。
  • 您的符号不是很清楚 - 在实际换行符之前有多少个反斜杠?请发布echo -e 命令,该命令将生成您要删除的确切内容的测试输出。是echo -e '\\\n' 还是echo -e '\\\\\n' 还是echo -e '\\n'

标签: shell unix sed


【解决方案1】:

给你:

echo -e 'hello\\\nthere' | perl -ne 's/\\\n/ /; print'

sed 中执行此操作会很困难(但可能是可能的),因为sed 会逐行处理输入,并且您的数据会分成多行。这个perl one-liner 逐行处理输入,而且由于它把换行符当作行的一部分,所以可以用空格进行替换,我认为有你想要的效果。

或者如果你更喜欢awk:

echo -e 'hello\\\nthere' | awk '{ if (gsub(/\\$/, " ")) printf; else print }'

起初我怀疑你的“特殊换行符”字符只是这个命令输出中的字符串\\n

echo 'hello\\nthere'

您可以用这样的空格替换字符串\\n

echo 'hello\\nthere' | sed -e 's/\\\\n/ /g'

【讨论】:

  • 谢谢,它有效!我使用的最终代码是这样的: perl -pi -e 's/\\\n/ _ /g' datafile.tsv
【解决方案2】:

您也可以使用tr (translate) 命令来执行此操作,例如

tr '\n' ' ' < inputfile.txt

编辑:在这种情况下使用它就像

tr '\\\n' ' ' < inputfile.txt

【讨论】:

  • 是的,但我只想删除前面有 2 个反斜杠的换行符
猜你喜欢
  • 2016-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 2013-09-25
  • 2021-08-09
  • 1970-01-01
相关资源
最近更新 更多