Vim 使用SED时如何保留字符串的一部分?
我在这样的文件中有多行Vim 使用SED时如何保留字符串的一部分?,vim,replace,Vim,Replace,我在这样的文件中有多行 APPLE JUICE APPLE JAM APPLE JELLY 我想将“APPLE”替换为“ORANGE”,并在字符串末尾附加“SHOP”。输出将是 ORANGE JUICE SHOP ORANGE JAM SHOP ORANGE JELLY SHOP 如何在sed或vim中执行此操作 编辑1: 我找到了一个在sed中有效的解决方案 #replace APPLE with ORANGE sed -i s/APPLE/ORANGE/g foo.txt #in a
APPLE JUICE
APPLE JAM
APPLE JELLY
我想将“APPLE”替换为“ORANGE”,并在字符串末尾附加“SHOP”。输出将是
ORANGE JUICE SHOP
ORANGE JAM SHOP
ORANGE JELLY SHOP
如何在sed或vim中执行此操作
编辑1:
我找到了一个在sed中有效的解决方案
#replace APPLE with ORANGE
sed -i s/APPLE/ORANGE/g foo.txt
#in a line containing ORANGE replace newline with SHOP
sed -i '/ORANGE/s/$/ SHOP/g'
现在的问题是,我无法让第二个命令在vim中工作。现在这是一个vim问题。给你:
kent$ echo "APPLE JUICE
APPLE JAM
APPLE JELLY"|sed 's/\bAPPLE\b/ORANGE/;s/$/ SHOP/'
ORANGE JUICE SHOP
ORANGE JAM SHOP
ORANGE JELLY SHOP
我添加了单词边界,这样像菠萝
这样的东西就不会被松橙
在vim中,使用相同的想法:
%s/\<APPLE\>/ORANGE/|%s/$/ SHOP/
给你:
kent$ echo "APPLE JUICE
APPLE JAM
APPLE JELLY"|sed 's/\bAPPLE\b/ORANGE/;s/$/ SHOP/'
ORANGE JUICE SHOP
ORANGE JAM SHOP
ORANGE JELLY SHOP
我添加了单词边界,这样像菠萝
这样的东西就不会被松橙
在vim中,使用相同的想法:
%s/\<APPLE\>/ORANGE/|%s/$/ SHOP/
不,@Kent的回答是在文件中的所有行中删除不包含APPLE和append SHOP的行。您需要使用RE子表达式:
echo "APPLE JUICE\
CHERRY JAM\
APPLE JELLY" | sed 's/^APPLE \(.*\)$/ORANGE \1 SHOP/'
ORANGE JUICE SHOP
CHERRY JAM
ORANGE JELLY SHOP
不,@Kent的回答是在文件中的所有行中删除不包含APPLE和append SHOP的行。您需要使用RE子表达式:
echo "APPLE JUICE\
CHERRY JAM\
APPLE JELLY" | sed 's/^APPLE \(.*\)$/ORANGE \1 SHOP/'
ORANGE JUICE SHOP
CHERRY JAM
ORANGE JELLY SHOP
在vim中,请在命令模式下尝试此选项
:%s/APPLE\(.*)/ORANGE\1 SHOP/g在vim本身中,请在命令模式下尝试此选项
:%s/APPLE\(.*)/ORANGE\1 SHOP/g@dyomas的回答是正确的,@Kent在所有行中不加区分地附加
SHOP
这里有一个解决方案,不使用子表达式;相反,它使用测试替换的t
命令,然后添加SHOP
sed 's/\bAPPLE\b/ORANGE/; t append; b; :append s/$/ SHOP/'
因为在替换的情况下,
t
命令会跳转(但我们需要相反的情况),所以我们必须“跳过”一个b
命令,否则将中止行处理。@dyomas正确地认为@Kent的答案不加区分地将SHOP
附加到所有行
这里有一个解决方案,不使用子表达式;相反,它使用测试替换的t
命令,然后添加SHOP
sed 's/\bAPPLE\b/ORANGE/; t append; b; :append s/$/ SHOP/'
因为在替换的情况下,
t
命令会跳转(但我们需要相反的情况),所以我们必须“跳过”ab
命令,否则会中止行处理。您尝试了什么?这是非常基本的。。。您需要使用s
命令来替换文本。您尝试了什么?这是非常基本的。。。您需要使用s
命令来替换文本。您的回答太棒了,但我们应该鼓励用户自己尝试一些东西,然后带着问题来到这里,而不是让他们不尝试就提问。(我相信这是一个在这里讨论得很热烈的话题/meta,只是我的2美分)谢谢!vim解决方案正是我所需要的。再次感谢@悉达多他想做的是,添加另一条评论“你尝试了什么?”。你的回答太棒了,但我们应该鼓励用户自己尝试一些东西,然后带着问题来到这里,而不是让他们不问而不试。(我相信这是一个在这里讨论得很热烈的话题/meta,只是我的2美分)谢谢!vim解决方案正是我所需要的。再次感谢@悉达多想做的是,再加上一句话“你试过什么?”。当我回答这个问题时,没有要求只在有苹果
的情况下才追加商店。此外,新要求是,为橙色添加车间。:)当我回答这个问题时,没有要求只在有苹果
的情况下才追加商店。此外,新要求是,为橙色添加车间。:)如果原始行有ORANGE
但没有APPLE
,则此命令不会将SHOP
添加到该行#在包含ORANGE的行中,将换行符替换为SHOP
如果原始行具有ORANGE
,但没有APPLE
,则此命令不会将SHOP
添加到该行<代码>#在包含橙色的行中,将换行符替换为SHOP