【问题标题】:How to delimit file with "\t\n" on a Mac如何在 Mac 上用“\t\n”分隔文件
【发布时间】: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


【解决方案1】:

不幸的是,BSD awk,也用于 macOS,不完全支持 多字符 记录分隔符 (RS)(符合 POSIX ) - 仅支持 单个文字 字符。

BSD sed,也用于 macOS,在正则表达式中支持 \n - 任何其他转义,包括 hex (例如,\x09受支持。
请参阅我的 this answer,了解 GNU 和 BSD sed 的全面比较。

假设您的sed 命令原则上有效,您可以使用ANSI C-quoted string ($'\t') 拼接一个 literal 标签字符。进入您的 sed 脚本(假设 bash(macOS 默认 shell)、kshzsh):

sed -e ':a' -e '$!{N;ba' -e '}' -e '/'$'\t''\n/s//NextEntry:/g'

请注意,为了替换换行符,您必须先指示 sed 将整个文件读入内存,这就是 -e ':a' -e '$!{N;ba' -e '}' 所做的(常见 GNU sed idiom @ 的 BSD Sed 兼容形式) 987654339@)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-06
    • 2013-06-19
    • 2014-09-18
    • 2011-08-03
    • 2011-02-14
    • 2020-03-16
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多