仅替换特定范围内的字符串

仅替换特定范围内的字符串

在规范中如何替换文件中的字符串?3. 仅当在特定上下文中找到该字符串时才进行替换,我正在尝试实现用文件中的空格替换管道,其结构如下:

12/12/2000|23:16:03|Shell Sc|8332|START|TEXT|WITH|SPACES|-|[END]|[Something else]

我需要这样的:

12/12/2000|23:16:03|Shell Sc|8332|START TEXT WITH SPACES -|[END]|[Something else]

代码:

echo "12/12/2000|23:16:03|Shell Sc|8332|START|TEXT|WITH|SPACES|-|[END]|[Something else]" | \
 sed 's/\(START.*\)\|/ \1/g'

有任何想法吗 ?

答案1

您的命令的问题是,即使g设置了标志,要匹配的文本的特定部分也只能包含在单身的匹配。由于.*是贪婪的,因此您最终只会删除最后一个管道字符。更不用说替换文本中的空格位于错误的位置。

您可以通过循环中的重复s命令来执行此操作,运行直到它不匹配任何内容为止。就像这样:

sed -e ':looplabel' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;t looplabel'

或者,使用较短的循环标签:

sed -e ':t' -e 's/\(START.*\)|\(.*|\[END\)/\1 \2/;tt'

答案2

在这种特殊情况下,所有|您想要替换为空格的内容都紧接在大写字母之后以及紧接在大写字母或 之前-。因此您可以使用环顾四周:

$ perl -ple 's/(?<=[A-Z])\|(?=[A-Z-])/ /g' file
12/12/2000|23:16:03|Shell Sc|8332|START TEXT WITH SPACES -|[END]|[Something else]

相关内容