shell腳本sed
1. shell腳本sed命令如何使用變數替換掉包含指定字元串的整行
#先將包含指定字元串的整行列印到變數tmp
tmp=$(sed -n '/${zip}/p' 文本名)
#然後將文本中這一整行字元串替換為你想要修改的字元串
sed -i 's/${tmp}/${zip}/g' 文本名
2. 使用shell腳本替換與更新文件里的一段內容,可以使用sed, awk等Linux工具
我也給個思路吧 —— 用sed根據地址范圍截取文件內容,用Here documents方法添加新的多行內容,然後重組文件。具體步驟如下:
1)截取test.xml文件起始行到<abcdef>行,保存到tmp文件;
2)將要添加的內容根據變數值展開,附加寫入tmp文件;
3)截取test.xml文件</abcdef>行到結束行,附加寫入tmp文件。
4)移動tmp文件覆蓋test.xml文件。
代碼:
#!/bin/sh
$hostnames="host1,host2,host3..."
$paragraph="many_strings"
sed-n'1,/^<abcdef>/p'test.xml>tmp
cat<<EOF>>tmp
forhnamein`echo"$hostnames"|tr','''`
do
insert$hname
insert$paragraph
done
EOF
sed-n'/^</abcdef>/,$p'test.xml>>tmp
mvtmptest.xml
注意:
1) for a in b 結構中,b集合里的內容必需要空格分隔。所以我這里做了轉換,用tr命令將逗號分隔改為了空格分隔。
2)第二個EOF必需頂格寫,前面不能有空格。
3. sed問題。shell腳本下的sed有點奇怪,求解答
#!/bin/bash
STRING="strncpy(orderInfo.szParam,param.getString("szParam").c_str(),sizeof(orderInfo.szParam)-1);szMemo"
cat1.txt|whilereadline
do
param=`echo$line|awk'{print$1}'`
memo=`echo$line|awk'{print$2}'`
echo$STRING|sed"s/szParam/$param/;s/szMemo/$memo/"
echo$dst
done
1.txt 內容:
001002003004
aabbccdd
輸出:
strncpy(orderInfo.001,param.getString("szParam").c_str(),sizeof(orderInfo.szParam)-1);002
strncpy(orderInfo.aa,param.getString("szParam").c_str(),sizeof(orderInfo.szParam)-1);bb
這個語句有問題:
echo$STRING|sed"s/szParam/$param/;sed/szMemo/$memo/"
我改成:
echo$STRING|sed"s/szParam/$param/;s/szMemo/$memo/"
或者
echo$STRING|sed"s/szParam/$param/"|sed"s/szMemo/$memo/"
4. shell腳本中的sed s/ /\ /g'這個命令是啥意思
sed的替換命令格式:s/A/B/g 或者 s#A#B#g 或者 s_A_B_g#只是分隔符而已,為滿足格式需要。將所有製表符\t替換為|g表示全局替換,有多少次替換多少次。
5. shell腳本 將一個含特殊字元的變數,寫入文件對應的位置中,使用sed要麼寫入的字元不正確要麼就報錯
假如SSID變數中沒有&這個特殊符號,那麼直接用sed是可以滿足的
SSID='~!@#$%^*[}(/.*\/'
sed-is,ssid=.*,ssid=$SSID,gfilename
但是如果有了&符號,放到sed中會作為特殊用途展開,導致保留了原來的匹配字元,寫入的內容會不正確。
此時,只能換一種方式,用awk來操作字元串,然後重新寫入到文件中,此時需要多一個臨時文件
cpfilenamefilename1;
awk'{gsub("^ssid=.*","ssid='$SSID'");print$0}'filename1>filename;
rm-ffilename1
6. shell的sed用法
sed 是Unix中類似於awk的行編輯器,對於sed工具包的所有操作來說, 我們最關心的其實就是3個最主要的操作. 分別是printing(列印到stdout), deletion(刪除), 和substitution(替換). 它與awk不同的地方在於sed是非交互的編輯器,而awk是可交互的編輯器。它即可以從stdin中接收文本輸入, 也可以從文件中接收文本輸入, 它對輸入中的指定行進行特定的操作, 一行操作一次, 然後將結果輸出到stdout, 或輸出到文件中. 在shell腳本中使用的話, sed通常都是作為管道工具鏈中的一個處理部分來使用.
Sed的處理方法,上面你提到的表達式叫作「模式匹配」,是一種替換操作:
s/pattern1/pattern2/
意思是用 pattern2 替換pattern1並顯示到屏幕上。
講講echo "uid=100(guest) gid=100(others) groups=10(users),11(floppy)"|sed 's/^[^(]*(\([^)]*\).*/\1/'的意思 :
echo 是向屏幕顯示一行字元
「|」叫管道,象水管一樣把「|」前面程序產生的輸出作為「|」後的程序的輸入。
sed 行編輯器。
's/^[^(]*(\([^)]*\).*/\1/' 對應上文提到的替換參數,分成兩部分,pattern1:/^[^(]*(\([^)]*\).*/
表示以不是以「(」開始的字元後面跟任意字元,然後是貪婪匹配模式運算(),任意以「(」字元開始,中間不包括")"字元的任意字元並以「)」後接。後面再接任意字元串。因為前面的程序輸出「uid=100(guest) gid=100(others) groups=10(users),11(floppy)」,所以貪婪匹配模式得到結果(guest)
pattern2:/\1/ \1是正則表達式的貪婪匹配模式運算結果。
所以shell語句輸出guest替換長長的一串「uid=100(guest) gid=100(others) groups=10(users),11(floppy)」