gpt4 book ai didi

string - 如何在 Mac 上使用 "\t\n"分隔文件

转载 作者:行者123 更新时间:2023-12-02 11:31:52 26 4
gpt4 key购买 nike

我有一个文档,其行由“\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

最佳答案

不幸的是,BSD awk(也在 macOS 上使用)不支持多字符记录分隔符 (RS)完全(与 POSIX 一致)- 仅支持单个文字字符。

BSD sed(也在 macOS 上使用)支持正则表达式中的 \n - 任何其他转义,包括十六进制(例如,\x09)不支持
参见this answer我的 GNU 和 BSD sed 的全面比较。

假设您的 sed 命令原则上有效,您可以使用 ANSI C-quoted string ($'\t') 拼接文字制表符。进入您的 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 习语 :a;$!{N;ba} 的 BSD Sed 兼容形式>).

关于string - 如何在 Mac 上使用 "\t\n"分隔文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44785509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com