Sed 命令未按预期工作

Sed 命令未按预期工作

我在 WSL 上使用 Ubuntu。看起来 sed 无法按预期工作。如果搜索文本包含多个字符,它不会替换文本。

当我执行以下命令时

sed 's/l/XYZ/gi'

它工作得很好,当我将 l 切换到像 localhost 这样的单词时

sed 's/localhost/XYZ/gi'

然后它就停止工作了。有什么建议吗?

更新:我正在使用 sed 版本 4.4

sed --version
sed (GNU sed) 4.4

答案1

本周我刚刚在 PowerShell 中遇到了类似的问题-replace,我推测您的输入中可能存在您看不到的多余字符。尝试hexdump -C对要替换的文本执行 。

例如,wsl.exe命令本身输出 UTF-16(可能甚至有些格式错误),基本上在每个 ASCII 字符后面放置一个 0 字节字符(如果我的字符编码术语不太正确,请原谅):

wsl.exe -l | hexdump -c

00000000  57 00 69 00 6e 00 64 00  6f 00 77 00 73 00 20 00  |W.i.n.d.o.w.s. .|
00000010  53 00 75 00 62 00 73 00  79 00 73 00 74 00 65 00  |S.u.b.s.y.s.t.e.|
00000020  6d 00 20 00 66 00 6f 00  72 00 20 00 4c 00 69 00  |m. .f.o.r. .L.i.|
...

wsl.exe -l | sed 's/W/B/'导致:

Bindows Subsystem for Linux Distributions:
Ubuntu (Default)
...

wsl -l | sed 's/Windows/GatesOS/'无法替换任何东西,类似于您所经历的情况:

Windows Subsystem for Linux Distributions:
Ubuntu (Default)
...

如果这是您面临的问题,至少 Linux/WSL 下的解决方案比 PowerShell 下的解决方案更简单。只需使用iconv将输入从 UTF16 转换为更易于管理的内容,例如 UTF8:

wsl.exe -l | iconv -f UTF16 -t UTF8 | sed 's/Windows/GatesOS/'

GatesOS Subsystem for Linux Distributions:
Ubuntu (Default)
...

相关内容