【问题标题】:Grep and Sed ErrorGrep 和 Sed 错误
【发布时间】:2013-10-19 23:19:54
【问题描述】:

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

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

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

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

喜欢grep 说0xffff0000 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 日

【问题讨论】:

  • 向我们展示您尝试过的命令并通过一些示例解释您的问题。
  • 您使用的是什么操作系统?您需要提供一些信息。它是二进制文件,还是您正在查看文本十六进制转储?如果你想操作一个二进制文件,sed 和 grep 可能做不到。 awk 不能。 Perl 或其他脚本语言可以。如果你有一个二进制文件并且想要获取十六进制转储,找到它,进行替换,然后将结果转换回二进制文件,这可能会起作用。但是您可能会比需要的更难。
  • Mac OS X 10.8.5 我不知道如何获取十六进制转储?
  • 您是否真的在寻找 string 0x04030000&0xffff0000,或者您是否真的想找到一组 4 或 8 个字节并用另一组 4 个字节替换它?
  • 是什么让你认为TTT 是一个命令?您创建了一个目录,名为TTT。

标签: bash replace sed terminal grep


【解决方案1】:

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

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

【讨论】:

  • 如果您在替换字符串中使用它,sed 也将解释 & 毫无价值。它现在不存在,但以后可能会出现。
  • 不起作用:(我已经尝试过这个命令 grep -rl '0x04030000&0xffff0000' /Users/Niresh/Desktop/TTT 但它没有显示任何文件但我确定有文件:)
  • @user1862521:我认为-i 特定于 GNU sed。这可能就是它不适合你的原因。
  • @FatalError,在FreeBSD 和OSX 中有一个-i(源自FreeBSD),但在旧版本中它需要一个选项,因此需要-i '',以及一个显式的-e在命令行的脚本部分之前。
【解决方案2】:

FatalError 已经在您的命令行中发现了& 问题。

此外,由于Parsing LS 问题,这是处理文件的不好方法。您应该使用find,而不是依赖xargs 来捕获文件名作为grep 的输出。例如:

# 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。

更新(每 cmets):

为我工作:

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$ 

如果这对您不起作用,请update your question 提供您尝试的结果。

【讨论】:

  • 你确定你包含了-type f for find 和-e for sed?
  • 然而,确实如此。看我的更新。这是所描述的问题的解决方案。如果您的描述需要改进,这可能会帮助您获得更多有用的答案。
  • 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 这是错误,我将 CD 放入 TTT 所在的 /Desktop 文件夹
  • 我看到您也将此添加到您的问题中。好东西。我很高兴它对你有用。
  • 您在问题更新中发布的结果表明它确实有效。您在末尾添加了一行当然不起作用,但这不是您问题的一部分。
【解决方案3】:

您可以使用以下内容:

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

这应该可以完成工作。

【讨论】:

  • 已尝试此命令错误多次此行 sed: 1: "/Users/Niresh/Desktop/T ...": N 命令末尾的多余字符
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 2017-08-28
    • 2013-11-28
    • 2014-01-13
    • 2018-02-24
    相关资源
    最近更新 更多