2016-04-06 66 views
0

我有了這些行的文件:

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

我想通過更換這些線路:

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

我在bash寫出來的代碼:

#!/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 

然後我運行代碼通過使bash change.sh > changed.txt但文件changed.txt不續這些修改。

,如果你幫我解釋一下我你的代碼的答案的語法,因爲我學習的bash

+3

單引號不插入變量,雙引號。 – choroba

+0

運行'sed' N次效率低下,並會給你許多重複的輸出行(每行的N個副本,每個副本的* 1 *適當修改)。如果您只是想在符合這些數字的線路(大概不是其他線路)上將'1.0'更改爲'2.0',則有更好的方法來做到這一點。 –

+0

@choroba:我已將腳本更改爲:'sed「s/s $ {VARIABLE} line linewidth 1 \ .0/s $ {VARIABLE} line linewidth 2 \ .0/g」./band-structure-calcite。 agr'並且它不起作用 –

回答

2

而不是運行sed幾次,在循環中生成一個sed腳本並運行一次:

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

非常感謝,它的工作,但我需要了解代碼... 該行:'回聲「s/s $ n line linewidth 1 \ .0/s $ n line linewidth 2.0/g」' prints:'s/s17 linewidthwidth 1 \ .0/s17 line linewidth 2 \ .0/g' ' s/s18 linewidth 1 \ .0/s18 linewidthwidth 2 \ .0/g' '.' '.' '。' 然後你用'done'完成循環,然後加上'| sed -f-文件名「。現在,什麼'| sed -f-文件名是什麼意思?再次感謝:) –

+0

@DavidC .:它調用sed將循環的輸出解釋爲其腳本。 – choroba

+0

好的,非常感謝! –

1

做一個正則表達式與您的數字我會非常感謝:

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

感謝您的回答:) –

1

用地址par中的正則表達式替換循環sed命令的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/)匹配線開頭S17,S18,... S28或,後跟一個空格或標籤,sed僅適用以下s/1\.0$/2.0/命令那些線。其他線路不變。整個文件只讀一次,輸出包含每個輸入行一個輸出行,與原始文件不同。

+0

感謝您的回答! +1! –