【发布时间】:2017-11-30 19:35:04
【问题描述】:
我有一个文档,其行由“\t\n”分隔。记录由“\t”或“\n”分隔。
通常,这应该是一个简单的 awk 查询:
BEGIN {
RS='\t\n';
}
{
print;
print "Next entry:";
}
但是,在 Mac 上,似乎不支持正则表达式(也许我做的不对?)所以我尝试了,RS="\t\n";但是,这被解释为RS='\t | \n'。从命令行运行 awk 的类似问题:
awk 1 RS='\t\n' ORS='abc' input > output
替换\t,但保留\n。
下一次尝试:使用tr。对于多个字符的序列,这显然会失败——因为\t 和\n 都在行中单独使用。
下一步:
sed -e '/\t\n/s//NextEntry:/g' input > output
但是,不起作用。输入任何 ASCII 字符序列而不是 \t\n 都可以。
阅读手册。它表示 sed 字符串不支持 \t。很公平
sed -e '/\x9\xa/s//abc/' input > output
还是不行。想法:使用tr将\t和\n替换为输入文件中未使用的字符,使用sed将它们更改为我想要的,然后tr将剩余的字符更改回它们应该的是。
tr: Illegal byte sequence
事实证明,f6 字符使 tr 完全失败。
查看了Sed not recognizing \t instead it is treating it as 't' why? 中的建议。这可能适用于替换输出字符串(“通过 CTRL+V 将选项卡粘贴到命令提示符”建议除外——shell 刚刚拒绝了该粘贴。),但在我的情况下似乎没有帮助。
也许是因为它是 Mac?也许是因为那是我正在寻找的文本,而不是替换?也许是与\n的组合?
还有其他建议吗?
更新:
我找到了线程 How can I replace a newline (\n) using sed? 。显然,我什至无法使用该线程中的建议将\n 替换为字符串“abc”。
编辑:源文件的十六进制头:
5a 20 4e 4f 09 0a 41 53 20 4f 46 20 30 31 2d 30
34 2d 30 35 20 45 4d 50 4c 4f 59 45 45 0a 47 52
4f 55 50 09 48 49 52 45 20 44 41 54 45 09 53 41
4c 41 52 59 09 4a 4f 42 20 54 49 54 4c 45 09 0a
4a 4f 42 20 4c 45 56 45 4c 0a 53 45 52 49 45 53
09 41 50 50 54 20 54 59 50 45 09 0a 50 41 59 20
53 54 41 54 55 53 0a f6
【问题讨论】:
-
你能提供一份你的"unhappy"文件吗?
-
@MarkSetchell 好的,我上传了头像。
标签: string macos shell unix replace