如何使用sed仅替换文件中的特定空格?

Alf*_*ock 1 sed

我在一个文件中有这个内容,我想用管道符号 ( |)替换某些位置的空格。我为此使用了sed,但它正在替换字符串中的所有空格。但我不想替换第 3 个和第 4 个字符串的空间。

如何实现这一目标?

输入:

test test test test
Run Code Online (Sandbox Code Playgroud)

我的尝试:

sed -e 's/ /|/g file.txt
Run Code Online (Sandbox Code Playgroud)

预期输出:

test|test|test test
Run Code Online (Sandbox Code Playgroud)

实际输出:

test|test|test|test
Run Code Online (Sandbox Code Playgroud)

ogu*_*ail 5

如果原始输入不包含任何管道字符,你可以这样做

sed -e 's/ /|/g' -e 's/|/ /3' file
Run Code Online (Sandbox Code Playgroud)

保留第三个空格。否则请参阅其他答案。


row*_*oat 5

sed 's/ /\
/3;y/\n / |/'
Run Code Online (Sandbox Code Playgroud)

由于换行符不能出现在 sed 模式空间中,您可以将第三个空格更改为换行符,然后将所有换行符和空格更改为空格和管道。

GNU sed 可以\n在替换文本中使用:

sed 's/ /\n/3;y/\n / |/'
Run Code Online (Sandbox Code Playgroud)