regex
  • linux
  • bash
  • command-line
  • sed
  • 2013-12-19 48 views 0 likes 
    0

    替換線我有這樣一句臺詞:與SED但保持原線

    param1='123' 
    

    我想以下幾點:

    param1='123' 
    param2=123 
    

    哪裏123可以是任意值。

    我可以用得到param2

    sed -i "s/param1=\([0-9]\+\)/param2='\1'/g" '{}' \; 
    

    但隨後我就失去param1

    我也可以用附加線param2

    sed -i "param1='\([0-9]\+\)';/a \param2=\1;" 
    

    但是這種模式並不認可,我結束了param2=1

    有沒有辦法這兩個命令或工作的另一種方式結合起來這個?

    +0

    將'sed'內聯腳本封裝在單引號中通常會更好。那麼你不必擔心是否與shell的cmd行處理有任何交互。如果您需要傳遞一個shell變量並將其擴展(僅作爲一般規則,但不是硬性規則),則僅對sed內聯腳本使用dbl-quotes。祝你好運。 – shellter

    +0

    謝謝你的庇護所。我用了雙引號,因爲我不希望單引號干擾123周圍的單引號。也許我可以用'123 \' – user1792403

    +0

    轉義,對不起,我錯過了你的模式。我不認爲'......''123''''會起作用。但是你可以使用各種引用方法,即''''''123'''....''。祝你好運。 – shellter

    回答

    1

    你可以說:

    sed -r "s/(param1='([^']*)')/\1\nparam2=\2/" filename 
    

    (添加-i選擇就地編輯。)

    +0

    這與'-r'選項一起工作,但是如果我將'-r'更改爲'-i',則's命令的RHS'中出現sed:-e表達式#1,字符35:無效引用\ 2的錯誤'或'-e' – user1792403

    2

    給人一種擴展,-i標誌創建一個備份,以便foo.ini將被更新和原始未修改版本會被發現foo.ini.bak

    $ find . -name '*ini' -exec sed -ri.bak 's/param1=.([0-9]+)./&\nparam2=\1/' {} \; 
    

    sed命令g標誌可能是多餘的,因爲在Unix配置文件中,單個行中設置了單個選項。該命令將param1=123替換爲param1=123\nparam2=123,因爲&代表整個比賽,值123在第一個捕獲組中捕獲。

    &  # Whole match 
    \n  # Newline character 
    param2= # Literal string 
    \1  # First capture group 
    

    所以基本上這條線是重複的,但是選項被改變並且值保持不變。

    +0

    謝謝你的回答,我會在第二時間嘗試。請注意我並不是指單參數在param2中,這是否會改變你的答案?我編輯了問題 – user1792403

    +0

    @ user1792403我的錯誤,我認爲這是你的一個遺漏。我已經更新了我的答案以反映這一點。 –

    +0

    這似乎有點複雜,我對sed很新。但+1,因爲它看起來令人興奮,當我更好地理解事情時,我會回來看看這個 – user1792403

    1

    這可能爲你工作(GNU SED):

    sed "p;s/1='\([^']*\)'.*/2=\1/" file 
    
    -1

    sed -i "s/\(param1='\([0-9]\+\)'\)/\1\nparam2=\2/g"

    似乎工作。

    與devnull的回答類似,但沒有使用-r(需要在不使用擴展正則表達式時在括號之前添加反斜槓)。

    相關問題