sed在FreeBSD和Linux上的行为不同吗?


12

我同时使用Linux和FreeBSD(特别是我使用Debian Linux和PC-BSD),但是我发现有些奇怪sed

我经常需要将“制表符分隔值”文件转换为“逗号分隔值”。我知道的最简单的方法是使用sed,例如:

sed 's/\t/,/g' inputFile.txt > outputFile.csv

这在Linux上完美运行:用逗号替换每个选项卡...但是在FreeBSD上,它什么也不会替换!

我想念什么吗?FreeBSD的语法sed是否不同于Linux上的语法?

Answers:


9

也许您应该使用该-E选项(或-r按照手册中的说明)来保持与GNU Sed的兼容性。如果您习惯使用Gnu Sed(在FreeBSD上移植gsed),可以安装它,否则移植脚本会花费很长时间。

记住 如果BSD上的某些命令不像该实用程序的GNU版本那样,则并不意味着它已损坏;)


1
谢谢。该-E选项可以解决问题(在FreeBSD和Mac OS X上都是如此)。
Barranka

在我的FreeBSD 9上,-E选项无济于事。
方舟

6

是的,有很多不同之处,就是我唯一知道的行为-i

我从未使用过BSD,因此我无法真正提供详细信息,但可以使用tr替代方法:

tr '\t' , < inputFile.txt > outputFile.csv

令人愉快的副作用是tr应该明显更快。我在Linux上使用具有50000行的测试文件进行了测试,每行都有2个选项卡:

$ time tr '\t' , < foo.txt > /dev/null 

real    0m0.004s
user    0m0.000s
sys     0m0.000s

$ time sed 's/\t/,/g' foo.txt > /dev/null 

real    0m0.039s
user    0m0.036s
sys     0m0.000s

tr '\t' ,tr $'\t' ,tr '[\t]' '[,]'甚至可以移植到某些旧的SysV系统。
斯特凡Chazelas

tab是的默认分隔符cut。该POSIX规范的tr[对于旧的SysV,我错了。正如POSIX规范指出的那样[,仅适用于该范围。
斯特凡Chazelas

@StephaneChazelas就是这样,很抱歉,不确定我是否将其与之混淆。无论如何,感谢您的澄清。
terdon

4

是的,与GNU sedFreeBSD 不同,FreeBSD sed不会解释\t正则表达式中的ANSI C转义序列。

在这种情况下,获得最不常见的去噪器的一种方法是使用printf

tab="$(printf '\t')"
printf '\t\n' | sed 's/'"${tab}"'/,/g'
printf '\t\n' | sed 's/'"$(printf '\t')"'/,/g'

sed -i如果开关或选项紧随-i开关之后,就可以使就地文件编辑的行为兼容,例如sed -i -e 's/x/X/g' file既适用于GNU sed也适用于FreeBSD sed

FreeBSD的最新版本sed(FreeBSD 8.1或更高版本)已进行了-r切换,以提高与GNU的兼容性sed

(此外,在sed正则表达式中使用POSIX字符类也是确保兼容性的好方法)。

有关POSIX兼容sed实现的替代方案,请参见:最小化-一种更小,更便宜,更快的SED实现


3

您应该使用文字TAB字符而不是\t

sed 's/    /,/g' inputFile.txt > outputFile.csv

请参阅Stephane关于另一个问题的评论

以下文章也可能使您感兴趣:

我引用相关部分:



正则表达式的区别正则表达式的语法在SED的不同版本之间略有不同。大多数差异涉及用于匹配非打印字符的特殊转义模式,例如ASCI铃声和换页。


0

登录后,我会看到下一条公告并保存。希望对其他人也有用

是否要使用sed(1)在适当位置编辑文件?好了,在名为“ foo”的文件中用“ o”替换每个“ e”,您可以执行以下操作:

sed -i.bak s/e/o/g foo

您将在名为“ foo.bak”的文件中获得原始文件的备份,但是如果您不希望备份:

sed -i '' s/e/o/g foo

-i选项被覆盖已经,虽然
杰夫·夏勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.