2012-11-12 49 views
3

在文件(file1.txt)中,我有/path1/|value1(一個路徑,後跟一個值)。我需要找到包含該(唯一)路徑的行,然後更改該值。所以該行最終應該爲:/path1/|value2使用變量在ksh中查找並替換包含正斜槓的字符串

挑戰在於/path1/,value1value2部件都包含在變量中。

當我不使用一個變量,我可以使用(thanks to this page):

sed '/path1/s/value1/value2/g' file1.txt > copyfile1.txt 

(這將創建原始文件,我可以使用mv後覆蓋原文件的副本)

這只是尋找path1。要搜索/path1/我可以使用:

sed '/\/path1\//s/value1/value2/g' file1.txt > copyfile1.txt 

使用the answers to this question about extracting a substring我可以把/path1/value1value2部分納入變量。

所以我當前的代碼是:

sed '/'"${PATH}"'/s/'"${PREVIOUS_VALUE}"'/'"${NEW_VALUE}"'/g' file1.txt > copyfile1.txt 

但是,這並不工作,因爲PATH變量包含正斜槓。利用信息from here我曾嘗試首先進行替換這樣的:

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g') 

,然後再使用FORMATTED_PATH代替PATH但隨後的查找和替換不工作(沒有錯誤消息,新的文件是空的)。並在日誌記錄FORMATTED_PATH = //path1//(我認爲是正確的)。

我該如何做到這一點查找和替換使用包含正斜槓的變量?

(我發現via this answer,我需要關閉單引號,使用雙引號周圍的變量,然後再次打開單引號。但是,這並不能幫助與正斜槓。)

回答

1

的代碼是非常正確。相反的:

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\/\//g') 

我應該有:

FORMATTED_PATH=$(echo "${PATH}" | sed 's/\//\\\//g') 

這就產生正確記錄:FORMATTED_PATH = \/path1\/

1

awk將工作太:

awk -F '|' -v path="$paht" -v new="$new_value" '{ 
    if ($1 == path) {print path FS new} 
    else {print} 
}' file1.txt > copyfile1.txt 

另外,不要對你的shell變量使用全部大寫:你已經清除了你的shell的PATH變量用於查找程序。

+0

Thx Glenn,會檢查一下。也感謝PATH提示... *臉紅* – Wikis

1

通常seds命令(如在s///中)支持使用除/以外的分隔符。例如:

$ echo '/path1/|value1' | sed 's,\(/path1/|\).*,\1value2,' 
/path1/|value2 
$ 

這與文件路徑名,其中包括/字符打交道時非常方便。

相關問題