2014-01-27 176 views
1

有沒有辦法替換多個捕獲的組,並用sed中的鍵值格式(由=定界)捕獲的組的替換多個捕獲的組?sed中的多個替換

對不起,這個問題是如此混亂這裏有一個例子

我有什麼:

aaa="src is $src$ user is $user$!" src="over there" user="jason" 

我想要的到底是什麼:

aaa="src is over there user is jason!" 

我不想硬編碼$var$的位置,因爲它們可能會改變。

+2

'Sed'是這個任務的錯誤工具。它缺乏最強大語言的許多數據和控制結構。 – Birei

+0

好吧,所以我想我仍然需要以編程方式完成這項任務。 – hobbes3

+0

sed是爲這樣一種任務而創建的。不是最簡單的,但仍然相對容易 – NeronLeVelu

回答

1
sed ':again 
s/\$\([[:alnum:]]\{1,\}\)\$\(.*\) \1="\([^"]*\)"/\3\2/g 
t again 
' YourFile 

正如你所看到的,sed是絕對沒有趣的做這種任務......即使有幾行元素,它也可以在很少修改的情況下工作,並且它不需要快速複雜的高級強大語言。

聖多美和普林西比:

  1. 創建一個標籤(一個即將成爲轉到)
  2. 搜索$ $,並採取他的同事的內容,並用它替換模式,下面的字符串,但之間的恩的一個occurence無模式內容定義
  3. 如果發生,請通過在腳本的標籤引用處重新啓動來再次嘗試。如果不打印和處理下一行
+0

爲什麼在't again'處必須有換行符?我試圖在一行中做所有事情,但沒有成功。 – hobbes3

+0

取決於我覺得sed版本,一些工作在GNU sed上。你的理由是由於標籤慣例,必須結束該行;在這種情況下似乎沒有用作行尾。也許可以使用一種格式,比如之前和/或之後的空間。我必須檢查oneliner頁面,看看是否有一些標籤ref也適用於posix sed – NeronLeVelu

1

這是一個快速的&骯髒的方式來解決它使用。它可能在某些方面失敗(空格,轉義雙引號,...),但它會得到這份工作對於大多數簡單的情況下完成的:

perl -ne ' 
    ## Get each key and value. 
    @captures = m/(\S+)=("[^"]+")/g; 

    ## Extract first two elements as in the original string. 
    $output = join q|=|, splice @captures, 0, 2; 

    ## Use a hash for a better look-up, and remove double quotes 
    ## from values. 
    %replacements = @captures; 
    %replacements = map { $_ => substr $replacements{$_}, 1, -1 } keys %replacements; 

    ## Use a regex to look-up into the hash for the replacements strings. 
    $output =~ s/\$([^\$]+)\$/$replacements{$1}/g; 

    printf qq|%s\n|, $output; 
' infile 

它產生:

aaa="src is over there user is jason!"