echo "mv u3_yunying.war u3_yunying.war_`date +%Y%m%d%H%M`" | sed "s/\(mv\) \(\w*.war\) \(\w*.war_\w*\)/\1/g"git
echo "mv u3_yunying.war u3_yunying.war_`date +%Y%m%d%H%M`" | sed "s/\(mv\) \(\w*.war\) \(\w*.war_\w*\)/\1 \2 \/tmp\/\3/g"
正則表達式
echo "mv a1_a.war" | sed "s/\(mv\) \(\w\)/\2/g"
express
echo "tar -zcvf tomcat" | sed "s/tar\ -zcvf\ /tar\ -zcvf\ \/tmp\//g"tomcat
echo "tar -zcvf tomcat" |sed 's/\(tar\) \(-zcvf\) \([a-zA-Z]\+\)/\3/g'
this
如何用Sed和正則表達式提取子字符串字符串
如今有以下一串字符串:string
"asdfkjasldjkf"shiner"dfit
需求:io
須要提取出shiner子字符串。擴展
命令以下:
[root@localhost /]$ echo "asdfkjasldjkf\"shiner\"df" | sed 's/\(.*\)"\(.*\)"\(.*\)/\2/g'
shiner
命令解釋
s: 表示替換命令
\(.*\)" : 表示第一個引號前的內容
"\(.*\)":表示兩引號之間的內容
)"\(.*\):表示引號後的內容
\2: 表示第二對括號裏面的內容
括號裏的表達式匹配的內容,能夠用\1,\2等進行引用,第n個括號對內的內容,就用\n引用。
這個命令的意思是:
用\2表明的第二個括號的內容(shiner)去替換整個字符串,這樣就獲得了咱們所須要的子字符串了。
sed命令能夠替換給定文本中的字符串。它能夠利用正則表達式進行匹配。
$ sed ‘s/pattern/replace_string/’ file
Sed命令也能夠從stdin中讀取輸入,如:
$ cat file | sed ‘s/pattern/replace_string/’
使用-i選項,sed能夠將替換結果應用於原文件,如:
$ sed –i ‘s/text/replace/’ file
以上sed命令會將每一行中第一處符合樣式的內容替換掉,若是要替換每一行中的全部內容,可在命令尾部加上參數g,如:
$ sed ‘s/pattern/replace_string/g’ file
選項/Ng能夠忽略前N-1處匹配,並從第N處開始替換,如:
$echo thisthisthisthis | sed ‘s/this/THIS/3g’
thisthisTHISTHIS
字符/在sed命令中做爲定界符使用,其實任意字符均可以看成定界符,如:
$ sed ‘s:text:replace:g’
$ sed ‘s|text|replace|g’
當定界符出如今樣式內部時,咱們必須使用前綴\對它進行轉義。
/pattern/d會移除匹配樣式的行,咱們能夠利用這個移除文件空白行:
$ sed ‘/^$/d’ file
在sed中,用&標記匹配樣式的字符串,例如:
$ echo this is an example | sed ‘s/\w\+/[&]/g’
[this] [is] [an] [example]
正則表達式\w\+匹配每個單詞,&對應於以前所匹配到的單詞。
Sed命令也能夠匹配給定樣式中的子串。\(pattern\)用於匹配子串。模式被包括在使用斜線轉義過的()中。對於匹配到的第一個子串,其對應的標記是\1,匹配到的第二個子串是\2,日後依次類推。例:
$ echo this is digit 7 in a number | sed ‘s/digit \([0-9]\)/\1/’
This is 7 in a number
這條命令將digit 7替換爲7。樣式中匹配到的子串是7。下面是包含多個匹配的例子:
$ echo seven EIGHT | sed ‘s/\([a-z]\+\) \([A-Z]\+\)/\2 \1/’
EIGHT seven
([a-z]\+\)匹配第一個單詞,([A-Z]\+\)匹配第二個單詞,\1和\2用來引用它們。
Sed命令還能夠組合多個表達式,如利用管道組合多個sed命令的方法能夠用如下方式代替:
$ sed ‘expression1’ | sed ‘expression2’
這等價於
$ sed ‘expression1; expression2’
Sed表達式一般用單引號來引用。不過也可使用雙引號。雙引號會經過對錶達式求值來對其進行擴展,例如:
$ text=hello
$ echo hello world | sed 「s/$text/HELLO/」
HELLO world
Sed應用(我工做中碰到的問題):
應用1:有這樣一個文件,每行的格式爲:
type1=value1 type2=value2 type3=value3…
其中type類型個數未知,每種type之間以’\t’隔開,要求提取出=右邊的value,輸出格式爲:
value1 value2 value3…
value之間以’\t’隔開。
解決方案:用sed語句將=左邊的字符替換成空串。
$sed –r ‘s/[^\t]*://g’ file
其中-r選項表示使用擴展的正則表達式
應用2:有這樣一個文件,每行的格式爲:
{type}:value t3 t4…
其中value與t之間以’\t’隔開,要求將type和value提取出來,輸出格式爲:
type value t3 t4…
各數據之間以’\t’隔開。
解決方案:用sed語句將{type}:替換爲type\t,使用子串替換的方法。
$ sed ‘s/{\(\w\+\)}:/\1\t/g’ file