【问题标题】:Replace special character with sed用 sed 替换特殊字符
【发布时间】:2019-09-07 14:51:30
【问题描述】:

我正在尝试用 sed 替换一个特殊字符,该字符是 Þ 替换为 ;

文件的行是,例如;

0370ÞA020Þ4000011600ÞRED USADOÞ0,00Þ20190414
0370ÞA020Þ4000011601ÞRED USADOÞ0,00Þ20190414
0370ÞA020Þ4000011602ÞRED USADOÞ0,00Þ20190414

谢谢!

编辑

它的工作和解决。

谢谢!!!

【问题讨论】:

标签: shell sed sh


【解决方案1】:

试试这个 - 对我来说简单的替换工作

sed 's/Þ/;/g'

【讨论】:

  • 是的,工作:DD 谢谢,如果我需要保存结果,会是这样吗? ` 's/Þ/;/g' file4.csv >> file4.csv' `
  • sed 's/Þ/;/g' infile > outfile 替换 outfile。如果您使用>>,结果将附加到outfile。如果对您有用,请考虑接受答案(在否决票下打勾)谢谢
【解决方案2】:

这就是 tr 的工作,但看看这些结果:

$ tr 'Þ' ';' < file
0370;;A020;;4000011600;;RED USADO;;0,00;;20190414
0370;;A020;;4000011601;;RED USADO;;0,00;;20190414
0370;;A020;;4000011602;;RED USADO;;0,00;;20190414

$ sed 's/Þ/;/g' < file
0370;A020;4000011600;RED USADO;0,00;20190414
0370;A020;4000011601;RED USADO;0,00;20190414
0370;A020;4000011602;RED USADO;0,00;20190414

tr 似乎将每个 Þ 视为 2 个重复字符 - sed 可能认为相同,但 tr 将一组字符转换为一组字符,sed 将正则表达式转换为字符串并且所以即使它认为Þ 是 2 个字符宽,它仍然会做你想做的事。所以只是一个关于尝试使用 tr 替换非 ASCII 字符的有趣警告 - YMMV!

【讨论】:

  • 有趣,在 macOS 和 FreeBSD 上为我工作,在 Linux 选项中可能需要 -s tr -s 'Þ' ';' &lt; file
  • @nbari 你不能使用-s,因为它会用一个; 替换输入中的多个连续Þs。我正在使用 cygwin FWIW。
  • 正确,因为这个特定的示例不包含像 fooÞÞbar 这样的行,它应该变成 foo;;bar 但如果你使用 tr -s 将变成 foo;bar
  • 在创建脚本和考虑可移植性时要考虑的好问题
【解决方案3】:

如果您的数据在 'd' 文件中,请尝试 gnu sed:

sed -E 'y/Þ/;/' d

【讨论】:

    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    相关资源
    最近更新 更多