2013-09-04 29 views
22

Dosyada bir satır bulmaya çalışıyorum ve sonraki satırı belirli bir değerle değiştiriyorum. Sed'i denedim, ama \ n değil gibi görünüyor. Bu nasıl yapılabilir?Eşleşen metni bul ve sonraki satırı değiştir

dosya şuna benzer:

<key>ConnectionString</key> 
<string>anything_could_be_here</string> 

Ve İşte bu

<key>ConnectionString</key> 
<string>changed_value</string> 

olarak değiştirmek istiyorum denedim ne:

sed -i '' "s/<key>ConnectionString<\/key>\n<string><\/string>/<key>ConnectionString<\/key>\n<string>replaced_text<\/string>/g" /path/to/file 

cevap

23

(GNU sed) :

sed '/<key>ConnectionString<\/key>/!b;n;c<string>changed_value</string>' file 
+1

Eğer ilgilenen herhangi bir osx kullanıcısı varsa, çalışmasını sağlamak için gsed gsed talimatını kullanabilirsiniz (macport ile kurun veya gnu-sed kurulumu yapın) – txulu

+1

ne '' b''' ve 'c'' burada? – ffledgling

+2

@ffledgling, '! B' önceki adresi (regexp) geçersiz kılar ve herhangi bir işlemden çıkıp, sed komutlarını sonlandırarak,' n', geçerli satırı basar ve ardından desen uzayının arkasına okur, 'c' akımı değiştirir Komutu takip eden dizgeye satır. – potong

22

Tek yön: Örnek dosya

Belirli soru için

$ sed '/Unix/{n;s/.*/hi/}' file 
Cygwin 
Unix 
hi 
Solaris 
AIX 

: 'merhaba' ile desen 'Unix' sonraki çizgisini değiştirerek, sed kullanarak

Bu sizin için işe yarayabilecek

$ sed '/<key>ConnectionString<\/key>/{n;s/<string>.*<\/string>/<string>NEW STRING<\/string>/}' your_file 
<key>ConnectionString</key> 
<string>NEW STRING</string> 
+0

Ben sed 'olsun: 1: "/ ConnectionString <...": yerine komut kötü bayrak:' sed calistiriken '}' ' '/ <\/key> /{n;s/.*/ testini ConnectionString <\/string> /} '$ HOME/Documents/temp.rdp' – bswinnerton

+0

güncelleştirilmiş çözüm – Guru

+1

Hrm, hala OSX'de hatayı alıyor. – bswinnerton

2

Çalışıyor. Ek olarak sen,

sed '/<key>ConnectionString<\/key>/!b;n;n;c<string>changed_value</string>' file 

Not iki n 's yazarsanız, o kadar ileri iki satır ve sonrasında yerini belirtmeyi ilgileniyor.

+0

Verimi sed'den basmak istiyorsanız, '-i' anahtarını kullanın. – Mausy5043

İlgili konular