首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在变量第一次出现后替换行中字符串的第一次出现

如何在变量第一次出现后替换行中字符串的第一次出现
EN

Stack Overflow用户
提问于 2021-10-18 08:01:10
回答 2查看 113关注 0票数 1

我在使用sed作为搜索字符串使用变量并跨多行执行此操作时遇到了一些分层问题。我可以做这两件事,但不能同时做。我正在处理一个类似于这样的xml文件。

代码语言:javascript
复制
<tag property="search1">
        string
</tag>
<tag property="search2">
        string
</tag>
<tag property="search3">
        string
</tag>

我试图顺序地将" string“替换为另一个值,具体取决于它前面行上的"search”字符串的数量,并使用一个脚本。这个脚本会增加一个计数器来完成这个任务。

如果已经知道"$n“,我可以在"search$n”之后找到并替换"string“:

代码语言:javascript
复制
$ sed '$!N;/search2/ s/\string/foo/;P;D' test
<tag property="search1">
        string
</tag>
<tag property="search2">
        foo
</tag>
<tag property="search3">
        string
</tag>

我可以根据变量搜索替换字符串:

代码语言:javascript
复制
$ n=2 
$ sed "/search$n/ s/search/foo/" test
<tag property="search1">
        string
</tag>
<tag property="foo2">
        string
</tag>
<tag property="search3">
        string
</tag>

,但我还没有想出如何将两者结合起来:

代码语言:javascript
复制
$ sed '$!N;/search$n/ s/\string/foo/;P;D' test

上面的命令可以工作;因为它不抛出错误,但它不解析变量--我尝试过对它进行转义,并将其放入双引号或单引号并转义这些变量。允许我在sed中解析多行的参数似乎需要单引号,而在搜索字段中读取变量则需要双引号.

我在OSX上使用gnu-sed。以下是我尝试过的其他一些事情:

代码语言:javascript
复制
sed "/search$n/,+1s/string/foo/" test
sed '/search$n/,+1s/string/foo/' test
sed "/search$n/,+1s s/string/foo/" test
sed '/search$n/,+1 s/string/foo/' test
sed '' -e '/search$n/ {' -e 'n; s/string/foo/' -e '}' test 
sed '' -e '/search$n/ {' -e 'n; s/.*/foo/' -e '}' test 
sed '/search$n/!b;n;c/foo/' test 
sed '' -e '/search$n/!b;n;string' test 
sed '' -e "/search$n/ {' -e 'n; s/string/foo/' -e '}" test 
sed '' -e "/search$n/ {' -e 'n; s/.*/foo/g' -e '}" test 
sed '' -e "/search$n/ s/string/foo/" test 
sed -e "/search$n/ s/string/foo/" test 
sed "/search$n/ s/string/foo/" test 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-18 08:34:34

您需要声明n=2 (而不是i=2),然后使用双引号允许变量删除。

但是,您需要处理$!,这对于Bash来说是很特殊的。您可以使用

代码语言:javascript
复制
n=2
sed '$!'"N;/search$n/ s/string/foo/;P;D" test

输出:

代码语言:javascript
复制
<tag property="search1">
        string
</tag>
<tag property="search2">
        foo
</tag>
<tag property="search3">
        string
</tag>

'$!'"N;/search$n/ s/string/foo/;P;D"$! (没有变量扩展支持)和N;/search$n/ s/string/foo/;P;D (具有变量扩展支持)的连接。

票数 1
EN

Stack Overflow用户

发布于 2021-10-18 09:52:35

这可能对您有用(GNU sed):

代码语言:javascript
复制
n=2
sed '/search'"$n"'/{n;s/string/foo/}' file

n设置为2

search2上匹配,打印当前行并获取下一行。

如果下一行包含string,则将string替换为foo

以下行可能不包含string,而是包含search2,在这种情况下:

代码语言:javascript
复制
sed ':a;/search'"$n"'/{n;s/string/foo/;Ta}' file
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69612597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档