2016-04-06 34 views
0

için içinde bir $ VARIABLE bir "sed" komutu Ben bu satırları olan bir dosya:: döngü

s17 line linewidth 2.0 
s18 line linewidth 2.0 
. 
. 
. 
s28 line linewidth 2.0 
:

s17 line linewidth 1.0 
s18 line linewidth 1.0 
. 
. 
. 
s28 line linewidth 1.0 

Ben bu satırları değiştirmek istiyorum bash change.sh > changed.txt yaparak

#!/bin/bash 
for VARIABLE in {17..28} 
do 
    sed 's/s${VARIABLE} line linewidth 1\.0/s${VARIABLE} line linewidth 2\.0/g' ./band-structure-calcite.agr 
done 

Sonra kod çalıştırmasına ancak dosya changed.txt devam etmez:

ben bash bu kodu yazdım Bu değişiklikler.

senin sayılarla normal bir ifade yapın bash

+3

Tek tırnakçıklar değişkenleri yorumlamıyor, çift tırnak işareti var. – choroba

+0

'sed' N kere çalıştırmak verimsizdir ve size çok sayıda yinelenen çıktı satırı verecektir (her satırın N kopyaları, her kopyadaki * bir * ile uygun şekilde değiştirilmiş). Eğer bu sayılarla (ve muhtemelen başkaları değil) eşleşen hatlarda '' ''' '' '' i değiştirmek istiyorsanız, bunu yapmanın daha iyi yolları vardır. –

+0

@choroba: Komutu şu şekilde değiştirdim: "sed" s/s $ {VARIABLE} satır çizgisi 1 \ .0/s $ {VARIABLE} satır çizgisi 2 \ .0/g "./band-structure-calcite. agr 've işe yaramıyor –

cevap

2

sed çalışan daha birkaç kez, döngü içinde bir sed komut dosyası oluşturmak ve bir kez çalıştırın:

for n in {17..28} ; do 
    echo "s/s$n line linewidth 1\.0/s$n line linewidth 2.0/g" 
done | sed -f- ./band-structure-calcite.agr > changed.txt 
+0

Çok teşekkürler, işe yaradı, ama kodu anlamalıyım ... satır: echo "s/s $ n satır çizgisi 1 \ .0/s $ n satır çizgisi 2.0/g" ' baskılar:' s/s17 çizgi linewidth 1 \ .0/s17 satır çizgisi 2 \ .0/g' ' s/S18 hattı çizgi kalınlığı 1 \ .0/S18 hattı çizgi kalınlığı 2 \ .0/g' '.' ' .' '. Ardından, döngüyü "done" ve ardından "| sed-dosya adı. Şimdi, ne var | sed -f- dosyaadı demek? Tekrar teşekkürler :) –

+0

@DavidC .: Döngünün çıktısını betik olarak yorumlayan sed çağırır. – choroba

+0

Tamam, Çok teşekkürler! –

1

öğreniyorum olarak bana yardım ve bana kod cevapları sözdizimi açıklamak eğer ben çok takdir ediyorum: Daha ziyade

allnr="" 
for nr in {17..28} 
do 
    allnr+="${nr}|" 
done 
# Debug: echo "allnr=${allnr%|}" 
sed -r 's/s('"${allnr%|}"') line linewidth 1\.0/s\1 line linewidth 2.0/g' ./band-structure-calcite.agr 
+0

'dan koşuyorum. Cevabınız için teşekkürler :) –

1

adres par normal bir ifade ile döngü değiştirin sed komutunun t:

'/^s\(\(1[7-9]\)\|\(2[0-8]\)\)\s/ s/1\.0$/2.0/' ./band-structure-calcite.agr 

(/^s\(\(1[7-9]\)\|\(2[0-8]\)\)\s/) çizgiler boşluk veya sekme ardından S 17, S 18, ... ya S28 ile başlayan ve sed olanlara yalnızca aşağıdaki s/1\.0$/2.0/ komutu uygular maçları düzenli ifade çizgiler. Diğer hatlar değişmeden geçer. Tüm dosya tam olarak bir kez okunur ve çıktı, orijinalinizden farklı olarak giriş hattı başına bir çıktı satırı içerir.

+0

Cevabınız için teşekkürler! 1! –