2015-02-06 56 views
0

我需要在包含在$http_proxy env var中的URL(http://localhost:3128)後面添加單個文件的從PATTERN開始的所有行的末尾。在文件的某些行末尾添加包含在env var中的URL

$ sed "/^PATTERN/ s/.*/& test/" somefile 

它工作的很好,但只要我$http_proxy取代test,sed的會抱怨,因爲//它裏面的:

$ sed "/^PATTERN/ s/.*/& $http_proxy/" somefile 
sed: -e expression #1, char 25: unknown option to `s' 

所以我試圖用#作爲分隔符(如建議例如here),但sed沒有任何影響,如果模式突然不匹配:

$ sed "#^PATTERN# s#.*#& $http_proxy#" somefile 

有什麼想法?

+1

逃逸'\#'(第一'#'),或使用標準'/'這個範圍(和#'PATTERN。*#&$ http_proxy#「somefile' – NeronLeVelu 2015-02-06 15:12:01

+0

不要使用」pattern「這個詞,因爲它的含義很模棱兩可。對於數字,字符串還是正則表達式?是否需要部分匹配或完全匹配?如果完全匹配,哪些分隔了您要匹配的文本部分 - 多個字符或特定字符或別的嗎? – 2015-02-06 15:49:54

+0

你有正確的答案已經。一個額外的提示是,你可以簡化你的模式。嘗試類似'sed「/ pattern/s#$#$ htttp_proxy#」'如果你願意,你可以逃離第一個美元符號,但至少在bash和sh中,你不需要。如果你在csh或tcsh中執行此操作,則可能需要'sed「/ pattern/s#」'$'「#$ http_proxy#」' – ghoti 2015-02-06 16:04:07

回答

1

僅在s///部件中使用不同的sed分隔符。並且ypy不需要將&放在替換部分中,因爲您試圖在最後添加字符串,替換行$的末尾就足夠了。

sed "/^PATTERN/s~$~ $http_proxy~" somefile 
0

Apparently在這種情況下,第一分隔符必須與\前面:

$ sed "\#^PATTERN# s#.*#& $http_proxy#" somefile 

解決它確實如此。

1

使用一個工具,是由分隔符或變量的內容未受影響:在範圍選擇

$ cat file 
foo bar 
PATTERN here 
some line 

$ awk -v pxy="$http_proxy" '/^PATTERN/{$0=$0" "pxy} 1' file    
foo bar 
PATTERN here http://localhost:3128 
some line