gpt4 book ai didi

bash - 通过sed用多行变量替换字符串中的关键字

转载 作者:行者123 更新时间:2023-12-05 03:07:38 28 4
gpt4 key购买 nike

注:以下问题与this post有关, 但问题的重点和输入变量的格式都不同(即多行文件的内容)。因此,正确的解决方案也可能不同。

似乎通过 sed 用多行变量替换字符串中的关键字,只要所述变量包含明确的换行符 (\n)。

$ target="foo \n bar \n baz"
$ echo "qux\nquux" > file
$ solution=$(cat file)
$ echo "$solution"
qux\nquux
$ echo $target | sed -e "s|bar|$solution|"
foo \n qux
quux \n baz

但是,当我在文本编辑器中打开文件 file 并将换行符替换为换行符时,用 sed 替换失败。

# Newline character was manually replaced with linebreak in texteditor.
$ solution=$(cat file)
$ echo "$solution"
qux
quux
$ echo $target | sed -e "s|bar|$solution|"
sed: -e expression #1, char 9: unterminated `s' command

当输入变量没有显式换行符时,我如何更改 sed 命令以执行查找的替换?

最佳答案

简介/设置

sed 不一定是适合这项特定工作的工具。考虑以下选项——每个选项的示例都需要以下设置:

# Run this before testing any of the code below
source='bar'
target='This string contains a target: <bar>'
solution='This has
multiple lines
and /slashes/ in the text'

...并且每个都将发出以下输出:

This string contains a target: <This has
multiple lines
and /slashes/ in the text>

请注意,对于 sed,您需要选择一个不用于表达式的定界符(因此,对于 s/foo/bar/foobar 都不能包含 /);下面的答案都避免了这个限制。


Shell 内置参数扩展

shell 可以只用 built-in string manipulation functionality 执行相关替换:

result=${target//$source/$solution}
echo "$result"

Perl 单行代码作为 sed 的替代品

对于 shell 的内置匹配不合适的较长输入字符串,您还可以考虑使用 perl 单行代码,如 BashFAQ #21 中所述。 :

in="$source" out="$solution" perl -pe 's/\Q$ENV{"in"}/$ENV{"out"}/g' <<<"$target"

关于bash - 通过sed用多行变量替换字符串中的关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46914505/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com