-1

我想在递归目录中的某些文件中找到一个字符串并将其替换为另一个字符串。

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

我要替换的字符串是0x80863a30.

我尝试了一些示例,但grep导致sed了一些错误。

喜欢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

但我也试过这个 sed -i'' -e 's/0x04030000&0xffff0000/0x80863a30/g' “这是我的文本文件路径”

但是命令执行成功但文本仍然存在

我阅读了它显示的 sed 手册页

错误 包含值为 0x5C (ASCII `\') 的字节的多字节字符可能被错误地视为 a'',c'' 和i'' commands. Multibyte characters cannot be used as delimiters with thes'' 和 ``y'' 命令的参数中的行继续字符。

BSD 2005 年 5 月 10 日

4

4 回答 4

2

&的外壳正在干扰您。为避免这种情况,您应该引用您的搜索:

grep -rl '0x04030000&0xffff0000' /Users/Niresh/Desktop/TTT | xargs sed -i 's/0x04030000&0xffff0000/0x80863a30/g'
于 2013-10-11T19:30:10.683 回答
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.

更新(根据评论):

为我工作:

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

如果这对您不起作用,请使用您的尝试结果更新您的问题。

于 2013-10-11T19:34:38.533 回答
0

您可以使用以下内容:

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

这应该可以完成这项工作。

于 2013-10-11T19:32:56.427 回答
0

grep -rl 0x04030000&0xffff0000 /用户/Niresh/桌面/TTT | xargs sed -i 's/0x04030000\&0xffff0000/0x80863a30/g'

& 被识别为特殊字符来修复它只是为了在 & ( \& ) 解决问题之前添加一个斜杠 \

于 2013-11-18T16:59:06.317 回答