使用bash脚本删除行尾字符?

时间:2014-09-12 17:51:58

标签: linux macos bash scripting eof

我正在尝试创建一个脚本来删除windows放置的这些字符(/ r / n)。但是,如果他们之间(“)为什么这样? 因为转储文件放置这个字符我不知道为什么。 和报价之间的原因?因为只有在砍掉我的结果时它才会影响我

For Example. "this","is","a","result","from","database"

问题:

"this","is","a","result","from","da
tabase"

[编辑]

感谢@Cyrus的答案,我得到了类似enter image description here

的内容

,但它在替换命令'}'得到坏标志我在MAC OSX上

你能帮助我吗?

由于

1 个答案:

答案 0 :(得分:2)

OS X使用与通常安装在Linux中的sed不同的\r

最大的区别是像\n\r\n这样的序列没有像你期望的那样被扩展或用作表达式的一部分,并且你倾向于需要用分号分隔命令更多。

如果你可以使用sed one-liner实现一个规则,例如“在包含引号的行上删除任何$ od -c input.txt 0000000 F o r E x a m p l e . " t h 0000020 i s " , " i s " , " a " , " r e 0000040 s u l t " , " f r o m " , " d a 0000060 t a \r \n b a s e " \n 0000072 ”,它肯定会简化你的任务......

对于我的实验,我使用了我推断的样本输入数据:

od -A n -t o1 -v input.txt | rs 0 1 | while read n; do [ $n -eq 015 ] && read n && continue; printf "\\$n"; done

首先,仅限shell的解决方案可能是使用内置于操作系统的较小工具。例如,这是一个单行:

od -A n -t o1 -v input.txt | rs 0 1

为便于阅读而分手,这就是以下内容:

  • | while read n; do - 将文件转换为ocal数字流
  • [ $n -eq 015 ] && - 逐步完成数字......
    • read n - 如果当前的数字是15(即回程的八进制)
    • && continue - 读一行(从而跳过它),
    • printf "\\$n"; done - 并继续下一个八进制数字(因此在CR后跳过换行符)
    • while read line; do if [[ $line =~ .*\".*$'\r'$ ]]; then echo -n "${line:0:$((${#line}-1))}" else echo "$line" fi done < input.txt - 打印当前的八进制数。

这种数据转换和流逻辑在管道中运行良好,但在sed中实现起来有点困难,它只知道如何处理原始输入而不是转换形式。

另一个bash选项可能是使用与原始输入行匹配的条件表达式:

{{1}}

这会遍历文本,如果它看到CR,它会打印所有内容而不包括它,没有尾随换行符。对于所有其他线条,它只是像往常一样打印它们。结果是具有回车的行被连接,而其他行则没有。

从sed的角度来看,我们正在处理两条输入线,第一条输入线以回车结束。这样做的策略是搜索回车,删除它们并加入线路。我挣扎了一段时间试图拿出能做到这一点的东西,然后放弃了。不是说这是不可能的,但我怀疑一个通常有用的脚本将是冗长的(按照sed标准)。