2015-01-12 65 views
1

我想寫一個修改文件的腳本。 我想檢查文件中的定義文本,如果它存在改變它,如果它不添加它。 文本改變的變量定義:多個循環

line1=text string 1 
line2=text string 2 
line3=text string 3 
# new values 
line1Arg=value 1 
line2Arg=value 2 
line3Arg=value 3 

到目前爲止,我有以下幾點:

for i in $line1 $line2 $line3; 
do 
oldarg=`grep $i $file |cut -d"=" -f2`; 
chkexists=`grep -c $i $file` 
if [ $chkexists -eq 0 ]; then 
cp $file $tmpfile 

這是我在哪裏卡住了... 他做了一個變量$循環和linexArg添加到$ tmpfile?

echo $i='new value' >> $tmpfile; 
echo "$i added with newvalue"; 
else 
echo "$i exists with $oldarg"; 

可能很簡單,但我是新手腳本!

編輯1:

感謝馬特我現在有這個,從$ line1-5只增加了1行,它應該增加2條人失蹤線,4號線$ $和LINE5

file=/folder/file 
tmpfile=$file.tmp 

# strings to find and modify/add 
line1=text string 1 
line2=text string 2 
line3=text string 3 
line4=text string 4 
line5=text string 5 
# new values 
line1Arg=120 
line2Arg=370 
line3Arg=100 
line4Arg=999 
line5Arg=1000 

for i in $line1 $line2 $line3 $line4 $line5; 
do 
result=`grep $i $file` 
if [ -z $result ] 
then 
cp $file $tmpfile 
echo $i >> $tmpfile 
else 
cat $file | sed "s/$i/$newi/g" > $tmpfile 
fi 
done 

什麼我掙扎是如何循環的2套的變量和格式添加缺少的字符串 $行1 = $ line1Arg

EDIT 2

因此,沒有我有以下...

file=/folder/file 
tmpfile=$file.tmp 

# strings to find and modify/add 
line1=text string 1 
line2=text string 2 
line3=text string 3 
line4=text string 4 
line5=text string 5 
# new values 
line1Arg=120 
line2Arg=370 
line3Arg=100 
line4Arg=999 
line5Arg=1000 

for i in $line1 $line2 $line3 $line4 $line5; 
do 
for x in $line1Arg $line2Arg $lineArg $line4Arg $line5Arg; 
do 

result=`grep $i $file` 
oldarg=`grep $i $file |cut -d"=" -f2` 

if [ -z $result ] 
then 
cp $file $tmpfile 
echo $i=$x >> $tmpfile 
echo "$i added with value $x" 

else 

if [ "$oldarg" = "$x" ]; then 
echo "$i already set - no change" 

else 
sed "s/$i=.*/$i=${x}/g" $file > $tmpfile 
echo "$i changed to value $x" 
fi 
fi 
done 

但它沒有添加所有缺少$ lineX = $ lineXArg文件? 我在想什麼?

編輯3

行,所以用sh -xi得到下面的輸出

> [email protected]:/ # sh -x /data/local/build.sh 
> + file=/sdcard/documents/build.txt 
> + tmpfile=/sdcard/documents/build.txt.tmp 
> + line1=wifi.supplicant_scan_interval 
> + line2=ro.sf.lcd_density 
> + line3=ro.media.enc.jpeg.quality 
> + line4=rixh.wallace 
> + line5=ro.telephony.call_ring.delay 
> + line1Arg=120 
> + line2Arg=370 
> + line3Arg=99999999 
> + line4Arg=999 
> + line5Arg=1000 
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt 
> + result='wifi.supplicant_scan_interval=120' 
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=120 
> + '[' -z 'wifi.supplicant_scan_interval=120' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/wifi.supplicant_scan_interval=120/wifi.supplicant_scan_interval=120/g' 
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt 
> + result='wifi.supplicant_scan_interval=120' 
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=120 
> + '[' -z 'wifi.supplicant_scan_interval=120' ']' 
> + >/sdcard/documents/build.txt.tmp 
> + cat /sdcard/documents/build.txt 
> + sed 's/wifi.supplicant_scan_interval=120/wifi.supplicant_scan_interval=370/g' 
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt 
> + result='wifi.supplicant_scan_interval=120' 
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=120 
> + '[' -z 'wifi.supplicant_scan_interval=120' ']' 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/wifi.supplicant_scan_interval=120/wifi.supplicant_scan_interval=999/g' 
> + cat /sdcard/documents/build.txt 
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt 
> + result='wifi.supplicant_scan_interval=120' 
> + grep wifi.supplicant_scan_interval /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=120 
> + '[' -z 'wifi.supplicant_scan_interval=120' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/wifi.supplicant_scan_interval=120/wifi.supplicant_scan_interval=1000/g' 
> + grep ro.sf.lcd_density /sdcard/documents/build.txt 
> + result='ro.sf.lcd_density=370' 
> + grep ro.sf.lcd_density /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=370 
> + '[' -z 'ro.sf.lcd_density=370' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/ro.sf.lcd_density=370/ro.sf.lcd_density=120/g' 
> + grep ro.sf.lcd_density /sdcard/documents/build.txt 
> + result='ro.sf.lcd_density=370' 
> + grep ro.sf.lcd_density /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=370 
> + '[' -z 'ro.sf.lcd_density=370' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/ro.sf.lcd_density=370/ro.sf.lcd_density=370/g' 
> + grep ro.sf.lcd_density /sdcard/documents/build.txt 
> + result='ro.sf.lcd_density=370' 
> + grep ro.sf.lcd_density /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=370 
> + '[' -z 'ro.sf.lcd_density=370' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/ro.sf.lcd_density=370/ro.sf.lcd_density=999/g' 
> + grep ro.sf.lcd_density /sdcard/documents/build.txt 
> + result='ro.sf.lcd_density=370' 
> + grep ro.sf.lcd_density /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=370 
> + '[' -z 'ro.sf.lcd_density=370' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/ro.sf.lcd_density=370/ro.sf.lcd_density=1000/g' 
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt 
> + result='ro.media.enc.jpeg.quality=100' 
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=100 
> + '[' -z 'ro.media.enc.jpeg.quality=100' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/ro.media.enc.jpeg.quality=100/ro.media.enc.jpeg.quality=120/g' 
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt 
> + result='ro.media.enc.jpeg.quality=100' 
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=100 
> + '[' -z 'ro.media.enc.jpeg.quality=100' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/ro.media.enc.jpeg.quality=100/ro.media.enc.jpeg.quality=370/g' 
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt 
> + result='ro.media.enc.jpeg.quality=100' 
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=100 
> + '[' -z 'ro.media.enc.jpeg.quality=100' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/ro.media.enc.jpeg.quality=100/ro.media.enc.jpeg.quality=999/g' 
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt 
> + result='ro.media.enc.jpeg.quality=100' 
> + grep ro.media.enc.jpeg.quality /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg=100 
> + '[' -z 'ro.media.enc.jpeg.quality=100' ']' 
> + cat /sdcard/documents/build.txt 
> + >/sdcard/documents/build.txt.tmp 
> + sed 's/ro.media.enc.jpeg.quality=100/ro.media.enc.jpeg.quality=1000/g' 
> + grep rixh.wallace /sdcard/documents/build.txt 
> + result= 
> + grep rixh.wallace /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg= 
> + '[' -z ']' 
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp 
> + >>/sdcard/documents/build.txt.tmp 
> + echo 'rixh.wallace=120' 
> + grep rixh.wallace /sdcard/documents/build.txt 
> + result= 
> + grep rixh.wallace /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg= 
> + '[' -z ']' 
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp 
> + >>/sdcard/documents/build.txt.tmp 
> + echo 'rixh.wallace=370' 
> + grep rixh.wallace /sdcard/documents/build.txt 
> + result= 
> + grep rixh.wallace /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg= 
> + '[' -z ']' 
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp 
> + >>/sdcard/documents/build.txt.tmp 
> + echo 'rixh.wallace=999' 
> + grep rixh.wallace /sdcard/documents/build.txt 
> + result= 
> + grep rixh.wallace /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg= 
> + '[' -z ']' 
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp 
> + >>/sdcard/documents/build.txt.tmp 
> + echo 'rixh.wallace=1000' 
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt 
> + result= 
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg= 
> + '[' -z ']' 
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp 
> + >>/sdcard/documents/build.txt.tmp 
> + echo 'ro.telephony.call_ring.delay=120' 
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt 
> + result= 
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg= 
> + '[' -z ']' 
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp 
> + >>/sdcard/documents/build.txt.tmp 
> + echo 'ro.telephony.call_ring.delay=370' 
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt 
> + result= 
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg= 
> + '[' -z ']' 
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp 
> + >>/sdcard/documents/build.txt.tmp 
> + echo 'ro.telephony.call_ring.delay=999' 
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt 
> + result= 
> + grep ro.telephony.call_ring.delay /sdcard/documents/build.txt 
> + cut '-d=' -f2 
> + oldarg= 
> + '[' -z ']' 
> + cp /sdcard/documents/build.txt /sdcard/documents/build.txt.tmp 
> + >>/sdcard/documents/build.txt.tmp 
> + echo 'ro.telephony.call_ring.delay=1000' 

EDIT 4

當前代碼:

#/system/bin/sh 

file=/sdcard/documents/build.txt 
tmpfile=$file.tmp 


# props to change 

line1=wifi.supplicant_scan_interval 

line2=ro.sf.lcd_density 

line3=ro.media.enc.jpeg.quality 

line4=rixh.wallace 

line5=ro.telephony.call_ring.delay 


# new values 

line1Arg=120 

line2Arg=480 

line3Arg=99999999 

line4Arg=999 

line5Arg=6666666666666 



for i in $line1 $line2 $line3 $line4 $line5; do 

for x in $line1Arg $line2Arg $lineArg $line4Arg $line5Arg; do 

result=`grep $i $file` 
oldarg=`grep $i $file |cut -d"=" -f2` 

if [ -z $result ] 
then 
cp $file $tmpfile 
echo $i=$x >> $tmpfile; 
echo "$i added with value $x" 
else 
cat $file | sed "s/$i=$oldarg/$i=$x/g"> $tmpfile 
echo "$i edited to $x" 

fi 

done 
done 

和輸出:

ro.telephony.call_ring.delay added with value 6666666666666 
wifi.supplicant_scan_interval edited to 120 
wifi.supplicant_scan_interval edited to 480 
wifi.supplicant_scan_interval edited to 999 
wifi.supplicant_scan_interval edited to 6666666666666 
ro.sf.lcd_density edited to 120 
ro.sf.lcd_density edited to 480 
ro.sf.lcd_density edited to 999 
ro.sf.lcd_density edited to 6666666666666 
ro.media.enc.jpeg.quality edited to 120 
ro.media.enc.jpeg.quality edited to 480 
ro.media.enc.jpeg.quality edited to 999 
ro.media.enc.jpeg.quality edited to 6666666666666 
rixh.wallace added with value 120 
rixh.wallace added with value 480 
rixh.wallace added with value 999 
rixh.wallace added with value 6666666666666 
ro.telephony.call_ring.delay added with value 120 
ro.telephony.call_ring.delay added with value 480 
ro.telephony.call_ring.delay added with value 999 
ro.telephony.call_ring.delay added with value 6666666666666 
+0

'sed -i'/ text string/value /'file'有什麼問題? –

+0

@glennjackman Id喜歡寫入臨時文件,所以我可以檢查所做的更改,然後將臨時文件複製到$ file – Valiceemo

+0

'sed's/text string/value /'file> file.new' –

回答

0

讓我們試試這個

#/system/bin/sh 

file=/sdcard/documents/build.txt 
tmpfile=$file.tmp 


# props to change 

line1=wifi.supplicant_scan_interval 
line2=ro.sf.lcd_density 
line3=ro.media.enc.jpeg.quality 
line4=rixh.wallace 
line5=ro.telephony.call_ring.delay 


# new values 

line1Arg=120 
line2Arg=480 
line3Arg=99999999 
line4Arg=999 
line5Arg=6666666666666 

linex=$line1,$line2,$line3,$line4,$line5  

for x in $line1Arg $line2Arg $lineArg $line4Arg $line5Arg; do 

#might need to be -f0, I forget syntax 
i=`echo $linex | cut -d"," -f1` 

#this is from some code I found online, not sure if it's right. 
linex=${linex#*,} 

result=`grep $i $file` 
oldarg=`grep $i $file |cut -d"=" -f2` 

if [ -z $result ] 
then 
cp $file $tmpfile 
echo $i=$x >> $tmpfile; 
echo "$i added with value $x" 
else 
cat $file | sed "s/$i=$oldarg/$i=$x/g"> $tmpfile 
echo "$i edited to $x" 

fi 

done 
done 

舊的東西

首先grep來看看,如果一個文件(或字符串或其他)包含在這種情況下,你的價值

result=`grep $i $file` 
if [ -z $result ] 
then 
cp $file $newfile 
echo "$i" >> $newfile 
else 
cat $file | sed "s/$i/$newi/g" > $newfile 
fi 

的sed命令包含用於替換的「s」,舊字符串,新字符串和「g」全局執行(而不是每個文件一次/ lin E /等)。如果它沒有包含在文件中,我還修改了它添加值的方式。 -z檢查一個字符串的長度是否爲零(如果grep沒有返回任何內容),並且>>追加到文件的末尾。

編輯:

此外,要關閉的評論,我覺得我應該解釋「|」 ,「>」和「>>」

「|」管道,管道輸出到另一個功能。也就是說,它使用命令的stdOut輸出到管道左側作爲管道右側命令的stdIn的輸入。如果沒有指定輸入文件,許多shell命令都使用stdIn。這對於將命令鏈接在一起非常有效。

「>」重定向,將輸出重定向到文件而不是stdOut。如果(就像你的情況那樣)你想要將輸出移動到一個文件中,而不是將它放在控制檯中,這非常有用。這將從頭開始寫入文件,但有效覆蓋文件輸出重定向到的文件。

「>>」追加,將信息附加到文件的末尾,而不是將其顯示在stdOut中。這意味着文件可以保存,但也可以添加程序的輸出。如果您需要在文件的末尾添加更多內容,這非常有用。

可能很難看到哪裏有用,但我希望它至少能說明它們是如何工作的,以及爲什麼我選擇在回答您的問題時使用它們。

編輯2: 添加「然後」的代碼,我認爲是如何發信號結構化的「if」語句(如if-else)而不是簡單的if(只是,否則)。我的shell編程有點生疏,我希望這有助於。

EDIT3: 換下場,如果到Fi(因爲這是在外殼正確的語法也改變$ i到$因爲重定向指示命令的輸出迴應我

如果你需要把一個循環。到這個地方$ I是每個變量要匹配在$ linexarg它會是這個樣子

for i in $linexarg 
do 
#above code 
done 

Here是我使用來確定參考。

編程快樂!離開,如果評論ÿ你有任何問題。

+0

當我運行這個時,我得到一個'意外的其他'錯誤? – Valiceemo

+0

我現在得到'意外完成'錯誤? – Valiceemo

+0

好的。我想也許我不夠具體。您的代碼會從$ file presumebaly中返回'missing missing missing'...。我想要的是追加文件的末尾,如果它丟失。我alsonwanr添加「$ line1 = $ line1Arg」$文件,如果它失蹤? – Valiceemo

0
sed 's/text string/value/' file > file.new 

sed是一個「流編輯器」 - 你傳遞文件,甚至管文本它,它可以操作的方式圖靈數字的文本。該程序逐行讀取文件,使用s///命令搜索正文表達式「文本字符串」,並將每行上的第一個實例替換爲文本「value」。