gpt4 book ai didi

bash - gawk 用于使用变量将包含模式的行替换为多行

转载 作者:行者123 更新时间:2023-11-29 09:42:41 26 4
gpt4 key购买 nike

我正在尝试用一组行替换包含使用 gawk 的模式的行。比方说,文件 aa 包含

aaaa
ccxyzcc
aaaa
ddxyzdd

我正在使用 gawk 将所有包含 xyz 的行替换为一组行 111\n222,我更改的内容将包含:

aaaa
111
222
aaaa
111
222

但是,如果我使用:

gawk -v nm2="111\n222" -v nm1="xyz" '{ if (/nm1/) print nm2;else print $0}' "aa"

变化的内容显示:

aaaa
ccxyzcc
aaaa
ddxyzdd

我需要包含 xyz 的整行,即 ccxyzccddxyzdd 必须替换为 111后跟 222。请帮忙。

最佳答案

您的代码的问题是 /nm1/ 试图匹配 nm1 作为模式而不是 nm1 变量中的值

$ gawk -v nm2="111\n222" -v nm1="xyz" '$0 ~ nm1{print nm2; next} 1' aa
aaaa
111
222
aaaa
111
222

感谢@fedorqui 的建议,next 可以通过简单地覆盖与所需文本模式匹配的输入行的内容来避免

gawk -v nm2="111\n222" -v nm1="xyz" '$0 ~ nm1{$0=nm2} 1' aa


GNU sed

解决方案
$ nm1='xyz'
$ nm2='111\n222'
$ sed "/$nm1/c $nm2" aa
aaaa
111
222
aaaa
111
222

c 命令将删除行匹配模式并添加给定的文本

关于bash - gawk 用于使用变量将包含模式的行替换为多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39872065/

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