我正在尝试创建一个脚本来删除windows放置的这些字符(/ r / n)。但是,如果他们之间(“)为什么这样? 因为转储文件放置这个字符我不知道为什么。 和报价之间的原因?因为只有在砍掉我的结果时它才会影响我
For Example. "this","is","a","result","from","database"
问题:
"this","is","a","result","from","da
tabase"
[编辑]
感谢@Cyrus的答案,我得到了类似
的内容,但它在替换命令'}'得到坏标志我在MAC OSX上
你能帮助我吗?
由于
答案 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标准)。