用sed代替一部分字符串

时间:2013-12-02 14:13:02

标签: regex bash sed

我有一个名为 foo.txt 的txt文件,其中包含以下行:

asdoij 989sda
asdad214234
ZSH_THEME="ys"
sadd iju9 98 ad a ="gh"
="ys"

我想使用sed将ys(第3行)替换为bar

我试过cat foo.txt | sed s:ZSH_THEME="(.+)":bar:没有运气。

任何人都可以告诉我该怎么做吗?提前致谢

6 个答案:

答案 0 :(得分:1)

需要引用sed命令,括号被认为是文字括号,没有需要转义的扩展正则表达式选项。

使用此sed:

> sed 's~\(ZSH_THEME="\)[^"]*\(".*\)~\1bar\2~' file
asdoij 989sda
asdad214234
ZSH_THEME="bar"
sadd iju9 98 ad a ="gh"
="ys"

OR用于内联编辑:

> sed -i.bak 's~\(ZSH_THEME="\)[^"]*\(".*\)~\1bar\2~' file

答案 1 :(得分:1)

双引号在shell中有特殊含义。如果您希望sed将它们作为文字字符引用它们:

 sed 's/ZSH_THEME="ys"/ZSH_THEME="bar"/'

请注意,你不能轻易告诉sed“只替换字符串的这一部分”,但有办法:

sed '/ZSH_THEME="ys"/s/"ys"/"bar"/' # Using an "address"

sed 's/\(ZSH_THEME="\)ys\("\)/\1bar\2/' # Using captures

答案 2 :(得分:1)

sed 's/\(ZSH_THEME="\).*/\1bar"/'

使用您的示例

kent$  echo 'asdoij 989sda
asdad214234
ZSH_THEME="ys"
sadd iju9 98 ad a ="gh"
="ys"'|sed 's/\(ZSH_THEME="\).*/\1bar"/'
asdoij 989sda
asdad214234
ZSH_THEME="bar"
sadd iju9 98 ad a ="gh"
="ys"

答案 3 :(得分:1)

这样的事情应该可以解决问题。这使用转义括号来保留模式的原始部分,然后只替换其余部分。

cat foo.txt | sed 's|\(ZSH_THEME=\"\)ys\(\"\)|\1bar\2|'

如果您想了解有关sed的更多信息,请阅读此链接,但这非常值得。 http://www.grymoire.com/Unix/Sed.html

答案 4 :(得分:0)

sed '/ZSH_THEME=/ s/ys/bar/' foo.txt 
用pd不需要猫。因为你只是改变“ys”,所以不需要提醒行的其他内容

答案 5 :(得分:0)

以下是awk

的使用方法
awk -F\" '/ZSH_THEME/ {$2="bar"}1' OFS=\" foo.txt
asdoij 989sda
asdad214234
ZSH_THEME="bar"
sadd iju9 98 ad a ="gh"
="ys"