2013-10-11 113 views
0

我想在遞歸目錄中的某些文件中找到一個字符串,並將其替換爲另一個字符串。Grep和Sed錯誤

我想查找的字符串是0x04030000&0xffff0000

我想替換的字符串是0x80863a30

我試過一些例子,但grepsed導致一些錯誤。

grep0xffff0000 command not found

即時通訊使用的Mac OS X 10.8.5

這是我嘗試過的命令,我收到的錯誤:嘗試這個命令太

localhost:~ User$ grep -rl 0x04030000&0xffff0000 /Users/Niresh/Desktop/TTT | xargs sed -i 's/0x04030000&0xffff0000/0x80863a30/g' 
[4] 1166 
-bash: 0xffff0000: command not found 
grep: warning: recursive search of stdin 

[4]+ Stopped     grep -rl 0x04030000 

但不工作

localhost:~ Niresh$ mkdir TTT 
localhost:~ Niresh$ echo "TTT 0x04030000&0xffff0000 bar" > TTT/bar 
localhost:~ Niresh$ find TTT -type f -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \; 
localhost:~ Niresh$ cat TTT/bar 
TTT 0x80863a30 bar 
localhost:~ Niresh$ TTT 0x80863a30 bar 
-bash: TTT: command not found 

但我試過這T OO SED -i'-e「S/0x04030000 &爲0xffff0000/0x80863a30/G」「這是我的文本文件路徑」

但該命令成功執行,但文本保持靜止

我閱讀sed的 手冊頁它顯示

錯誤多字節包含具有值0x5C(ASCII'\「)一個字節字符可以如行繼續字符 錯誤處理中的參數給 a'', C」」和i'' commands. Multibyte characters cannot be used as delimiters with the S‘’和「y」命令。

BSD 2005年5月10日

+1

向我們展示您嘗試的命令並用一些示例解釋您的問題。 – anubhava

+0

你在什麼操作系統上?您需要提供_some_信息。它是一個二進制文件,還是你正在通過文本十六進制轉儲?如果你想操縱一個二進制文件,sed和grep可能不會這樣做。 Awk不能。 Perl或其他腳本語言可以。如果你有一個二進制文件,並想獲得十六進制轉儲,找到它,做替換,並將結果轉換回二進制文件,這可以工作。但是你可能會比它需要的更難。 –

+0

Mac OS X 10.8.5 我不知道如何獲得Hext轉儲? –

回答

0

grep -rl 0x04030000 & 0xffff0000/Users/Niresh/Desktop/TTT | xargs的SED -i 'S/0x04030000 \ &爲0xffff0000/0x80863a30/G'

的&被確定爲特殊字符來修復它只是前&(\ &)添加斜線\解決了這個問題

2

&是由你的shell interpeted。爲了避免這種情況,你應該引用您的搜索:

grep -rl '0x04030000&0xffff0000' /Users/Niresh/Desktop/TTT | xargs sed -i 's/0x04030000&0xffff0000/0x80863a30/g' 
+0

值得一提的是,如果您在替換字符串中使用它,sed也會解釋'&',現在它不在,但它可能會在稍後出現。 –

+0

不工作:( 我已經嘗試過這種命令 的grep -rl「0x04030000和爲0xffff0000」 /用戶/ Niresh /桌面/ TTT 但它不顯示任何文件,但有文件我敢肯定:) –

+0

@ user1862521:我想' -i'是特定於GNU'sed'的,這可能就是爲什麼它不適合你。 – FatalError

0

您可以使用以下方法:

find /Users/Niresh/Desktop/TTT -type f -exec sed -i 's/0x04030000&0xffff0000/0x80863a30/g' {} \; 

這應該做的工作。

+0

試過這個命令錯誤是 這幾行幾行 sed:1:「/ Users/Niresh/Desktop/T ...」:N命令末尾的多餘字符 –

1

FatalError已經在你的命令行中發現了&問題。

此外,由於Parsing LS問題,這是處理文件的不好方法。而不是依靠xargs捕獲作爲grep輸出的文件名,您應該使用find。例如:

# find /Users/Niresh/Desktop/TTT -type f \ 
    -exec grep -q '0x04030000&0xffff0000' {} \; \ 
    -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \; 

(拆分爲多行更容易閱讀。)

這裏的想法是,find將負責爲您的文件名,並且將運行每個工具做的(1)分析和(2)修改。請注意,這裏的grep可能是多餘的,因爲sed只會對沒有找到搜索字符串的文件進行更改。

這可以避免您的文件名(空格或換行符或反斜槓)中會出現特殊字符的問題,這些問題會被您的管道誤解爲xargs

UPDATE(每評論):

工作對我來說:

[email protected]:~ 507$ mkdir foo 
[email protected]:~ 508$ echo "foo 0x04030000&0xffff0000 bar" > foo/bar 
[email protected]:~ 509$ find foo -type f -exec sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' {} \; 
[email protected]:~ 510$ cat foo/bar 
foo 0x80863a30 bar 
[email protected]:~ 511$ 

如果這不適合你,請update your question你嘗試的結果。

+0

這個命令現在也不能工作:( –

+0

你確定你包含'-type f' for find和'-e' for sed? – ghoti

+0

,但它沒有編輯 –