【问题标题】:Search and Replace String from text file Ubuntu从文本文件 Ubuntu 中搜索和替换字符串
【发布时间】:2017-01-06 05:36:47
【问题描述】:

我必须替换以下字符串

//@Config(manifest

下面的字符串,

@Config(manifest

所以这是我按照正则表达式创建的

\/\/@Config\(manifest

试过了

grep -rl \/\/@Config\(manifest . | xargs sed -i "\/\/@Config\(manifest@Config\(manifest/g"

但我收到以下错误:

sed: -e expression #1, char 38: Unmatched ( or \(

我必须递归搜索并执行此操作,尽管我遇到了上述错误。

【问题讨论】:

  • 为什么要额外 manifest$
  • 那是错误添加的,虽然还是一样的错误,但删除了
  • 你能把错误更新成新的吗,因为char值会改变
  • 得到同样的错误 sed: -e expression #1, char 39: Unmatched ( or (
  • 试试这个grep -l \/\/@Config\(manifest . | xargs sed -i "s/\/\/@Config(manifest/@Config(manifest/g"

标签: regex awk sed grep xargs


【解决方案1】:
grep -rl '//@Config(manifest' | xargs sed -i 's|//@Config(manifest|@Config(manifest|g'
  • 为当前目录指定. 对于grep -r 是可选的
  • sed 允许将除反斜杠或换行符以外的任何字符用作分隔符

编辑

如果文件名包含空格,则使用

grep -rlZ '//@Config(manifest' | xargs -0 sed -i 's|//@Config(manifest|@Config(manifest|g'

解释(假设是 GNU 版本的命令)

  • grep

    • -r 执行递归搜索
    • -l 选项仅输出文件名而不是匹配的模式
    • -Z 在每个文件名之后输出一个零字节(ASCII NUL 字符)而不是通常的换行符
    • 'pattern' 默认情况下,grep 使用 BRE(基本正则表达式),其中像 ( 这样的字符没有特殊含义,因此不需要转义
  • xargs -0 告诉xargs 用 ASCII NUL 字符分隔参数

  • sed

    • -i 就地编辑,如果要创建原始文件的备份,请使用 -i.bkp
    • s|pattern|replace|g g 标志告诉 sed 搜索和替换所有出现的位置。 sed 也默认为 BRE,因此无需转义 (。使用\( 意味着捕获组的开始,因此当它找不到关闭\) 时会出现错误

【讨论】:

  • 如果任何目录的名称中有空格,则它不适用于递归目录
  • 谢谢,它有效,但如果你在答案中解释命令,这样其他人可以轻松理解它会很棒,它也会提高答案质量
  • 感谢您提高答案的质量,这对未来会有很多帮助。
猜你喜欢
  • 2020-05-12
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多