regular expression (如何用Sed和正則表達式提取子字符串)


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

相關文章
相關標籤/搜索