我有一个名为 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:
没有运气。
任何人都可以告诉我该怎么做吗?提前致谢
答案 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"