2013-12-02 9 views
1

У меня есть TXT файл с именем foo.txt со следующими строками:заменить СЭД часть строки

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

Я хочу заменить ys (на линии № 3) с bar использованием СЭД ,

Я попробовал cat foo.txt | sed s:ZSH_THEME="(.+)":bar: wihtout any luck.

Может ли кто-нибудь показать мне, как это сделать? Заранее спасибо

ответ

1

Нужно процитировать команду sed и круглые скобки считаются буквальными круглыми скобками без расширенного параметра регулярного выражения, которое необходимо было экранировать.

Используйте этот СЭД:

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

ИЛИ для редактирования инлайн:

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

двойные кавычки имеют особое значение в оболочке. Quote их, если вы хотите sed, чтобы получить их как буквенные символы:

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

Обратите внимание, что вы не можете сказать СЕПГ «заменить только эту часть строки» легко, но есть способы:

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

или

sed 's/\(ZSH_THEME="\)ys\("\)/\1bar\2/' # Using captures 
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" 
1

Что-то вроде этого должно сделать трюк. Это использует скошенные скобки, чтобы сохранить исходные части шаблона, а затем просто заменить остальные.

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

Если вы хотите узнать больше о СЭД, эта ссылка имеет много читать, но это хорошо стоит. http://www.grymoire.com/Unix/Sed.html

+0

спасибо, я думаю, что это самый простой способ – gaggina

+0

I Я рад, что смог помочь :) – TopGunCoder

0
sed '/ZSH_THEME=/ s/ys/bar/' foo.txt 

кот не нужен с СЭД. Потому что вы просто изменить «YS», не нужно напоминать другую вещь линии

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" 
Смежные вопросы