2016-06-20 13 views
0

我試圖用sed使用在一個文件中的每一行的末尾插入sed命令插入另一sed命令 -用sed在文件中

sed -r 's/$/ | sed -r s\/abc\/xyz\/ /' filename.extension

我想未來是有內部sed周圍的單引號。因此,它看起來會喜歡 -

sed -r 's/$/ | sed -r 's\/abc\/xyz\/' /' filename.extension

我試圖逃逸內單引號,但沒有用。

基本上,我想下面的線 -

line 1 line 2 line 3

打開入─

line 1 | sed -r 's/abc/xyz/' line 2 | sed -r 's/abc/xyz/' line 3 | sed -r 's/abc/xyz/'

我無法獲得單引號,即使有轉義字符。

回答

2
sed -e "s:$: | sed -r 's/abc/xyz/':" yourfile 

你的問題是嵌套shell表達式的一般情況的一個例子。有很多方法可以做到這一點。

  1. 使用備用分隔符。這就是我在這裏所做的。
  2. 將子表達式分配給變量,然後展開它們。
  3. 使用很多\逃脫。
  4. 把你的子表達式放在一個文件中,然後read它。
+0

我不是用xyz取代abc。它在第二個sed命令中有另一個正則表達式,因此是引號。 –

+1

啊哈,好吧,我很高興你把你的例子簡化爲最小的東西,並且你還指定了一個期望行爲的例子。這是提問的正確方法。 – DigitalRoss

2

使用在外面的內SED和雙引號sed將簡化您的命令替代分隔符:

sed "s/$/ | sed -r 's~abc~xyz~'/" file.ext 

BTW是不是真的需要在內部SED

+0

關於bash的單引號和雙引號有什麼區別? –

+0

你不能在shell中的單引號內嵌入單引號 – anubhava

+0

@Aditya:這是否適合你? – anubhava

0

-r這可能會爲你工作(GNU sed):

sed 's/$/ | sed -r '\''s\/abc\/xyz\/'\''/' file 

使用'\''結束當前單引號,然後在shell中使用\'引用單引號和最後單引號來開始引用sed命令。使用\/引用sed命令中的正斜槓。

作爲替換命令可以使用任何分隔符:

sed 's#$# | sed -r '\''s/abc/xyz/'\''#' file 

減少引述的和量:

sed "s#$# | sed -r 's/abc/xyz/'#" file 

進一步降低它。然而,雙引號sed命令(或任何實用程序)可能會產生不必要的副作用,即元字符可以由shell進行評估,因此最好單引號並採用「類似洞」的機制'\''