2016-03-09 92 views
0

我有一個文件pattern.txt,它由一行非常長的複雜代碼(〜8200個字符)組成。Bash sed替換爲文件中文本的完全匹配

此代碼可以在多個目錄內的多個文件中找到。

我可以很容易地識別使用

grep -rli 'uniquepartofthecode' * 

我擔心的是我怎麼用確切的文本從文件中替換這些文件的列表?

我試圖做的:

var=$(cat pattern.txt) 
sed -i "s/$var//g" targetfile.txt 

,但我得到了以下錯誤:

的sed:-e表達式#1,焦炭96:未知的選項爲'S'

sed正在將我的$ var內容解釋爲正則表達式,我希望它只匹配確切的文本。

pattern.txt的內容可能是或多或少的字符組合,所以恐怕我無法有效地逃避每個字符。

有沒有使用sed的解決方案?或者我應該使用其他工具嗎?

編輯:

我嘗試使用此解決方案,以從我的文本文件正確的正則表達式。 Is it possible to escape regex metacharacters reliably with sed

總體過程是:

var=$(cat pattern.txt) 

searchEscaped=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<<"$var") 

sed -n "s/$searchEscaped/foo/p" <<<"$var" # if ok, echoes 'foo' 

這最後一個命令顯示 「foo」 的。 $ searchEscaped似乎已被正確轉義。 雖然,這是不返回任何東西(它應該不匹配的部分顯示FOO +文件的其餘部分):

sed -n "s/$searchEscaped/foo/p" targetfile.txt 
+1

選中此項:http:// stackoverflow。com/questions/29613304/is-it-it-escape-regex-meta-characters-reliable-with-sed – hek2mgl

+0

很好用,直到 'sed -n「s/$ searchEscaped/foo/p」<<<「$ search 「#if if,echo'foo'' 然後我嘗試 'sed -i」s/$ searchEscaped // g「targetfile.txt' 但是沒有成功 – TheTrueTDF

+0

您正在使用'-n'來取消sed的輸出。你能顯示你的輸入文件嗎? – hek2mgl

回答

0

我認爲,最好的解決辦法是在所有不使用正則表達式和訴諸串替代。要做到這一點

一種方法是用perl:

$ echo "$string_to_replace" 
some other stuff abc$^%!# some more 
$ echo "$search" 
abc$^%!# 
$ perl -spe '$len = length $search; 
while (($pos = index($_, $search, $n)) > -1) { 
    substr($_, $pos, $len) = "replacement"; 
    $n = $pos + $len; 
}' <<<"$string_to_replace" -- -search="$search" 
some other stuff replacement some more 

-p開關通過可變$string_to_replace的每一行(這可以很容易地由一個文件被替換)告訴Perl循環。 -s允許將選項傳遞給腳本 - 在這種情況下,我傳遞了包含搜索字符串的shell變量。

對於文件的每一行,while循環遍歷搜索字符串的所有匹配項。 substr用於分配的左側以替換$_的子字符串,該字符串指向正在處理的當前行。