我在 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)
...