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
命令会跳转(但我们需要相反的情况),所以我们必须“跳过”a
b
命令,否则会中止行处理。

您尝试了什么?这是非常基本的。。。您需要使用
s
命令来替换文本。您尝试了什么?这是非常基本的。。。您需要使用
s
命令来替换文本。您的回答太棒了,但我们应该鼓励用户自己尝试一些东西,然后带着问题来到这里,而不是让他们不尝试就提问。(我相信这是一个在这里讨论得很热烈的话题/meta,只是我的2美分)谢谢!vim解决方案正是我所需要的。再次感谢@悉达多他想做的是,添加另一条评论“你尝试了什么?”。你的回答太棒了,但我们应该鼓励用户自己尝试一些东西,然后带着问题来到这里,而不是让他们不问而不试。(我相信这是一个在这里讨论得很热烈的话题/meta,只是我的2美分)谢谢!vim解决方案正是我所需要的。再次感谢@悉达多想做的是,再加上一句话“你试过什么?”。当我回答这个问题时,没有要求只在有
苹果
的情况下才追加商店。此外,新要求是,为橙色添加车间。:)当我回答这个问题时,没有要求只在有
苹果
的情况下才追加商店。此外,新要求是,为橙色添加车间。:)如果原始行有
ORANGE
但没有
APPLE
,则此命令不会将
SHOP
添加到该行
#在包含ORANGE的行中,将换行符替换为SHOP
如果原始行具有
ORANGE
,但没有
APPLE
,则此命令不会将
SHOP
添加到该行<代码>#在包含橙色的行中,将换行符替换为SHOP