gpt4 book ai didi

sed - 如何更改包含模式的线的首次出现?

转载 作者:行者123 更新时间:2023-12-03 15:59:41 25 4
gpt4 key购买 nike

我需要找到第一个出现模式的行,然后用一个全新的行替换整个行。
我发现此命令代替了第一次出现的模式,而不是整个行:

sed -e "0,/something/ s//other-thing/" <in.txt >out.txt
如果in.txt是
one two three
four something
five six
something seven
结果,我进入out.txt:
one two three
four other-thing
five six
something seven
但是,当我尝试修改此代码以替换整行时,如下所示:
sed -e "0,/something/ c\COMPLETE NEW LINE" <in.txt >out.txt
这是我进入out.txt的方法:
COMPLETE NEW LINE
five six
something seven
您知道为什么第一行丢失了吗?

最佳答案

c\命令与2个地址一起使用时,将删除第二个匹配地址之间的所有行(包括第一个匹配地址),并在匹配第二个地址时打印出在c\之后指定的文本。如果输入中没有与第二个地址匹配的行,它将删除第一个匹配地址到最后一行之间的所有行(包括所有内容)。由于只想替换一行,因此不应在地址范围内使用c\命令。正常使用后,c\后面紧跟一个换行符。0,/regexp/地址范围是GNU sed扩展名,它也会尝试在第一行输入中匹配regexp,这与1,/regexp/不同。因此,GNU sed中的正确命令可能是

sed '0,/something/{/something/c\
COMPLETE NEW LINE
}' < in.txt
或如Sundeep所指出的那样简化
sed '0,/something/{//c\
COMPLETE NEW LINE
}' < in.txt
或单线
sed -e '0,/something/{//cCOMPLETE NEW LINE' -e '}' < in.txt
如果不希望使用文字换行符。
正如potong所指出的,这种单线工作也可以:
sed '0,/something/!b;//cCOMPLETE NEW LINE' in.txt

关于sed - 如何更改包含模式的线的首次出现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62857191/

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