Bash中用于替换字符串的sed命令出现问题

Bash中用于替换字符串的sed命令出现问题,sed,Sed,我一直在寻找一种方法来查找和替换我当前目录中所有fortran文件中的字符串。这里的大多数答案都是使用以下方法: sed -i 's/INCLUDE \'atm/params.inc\'/USE params/g' *.f 或 但是,当我使用这两个参数中的任何一个时,bash line continuation>会在下一行弹出,就好像它需要输入或其他参数一样。我还没有看到其他人遇到这种情况,我不知道该怎么办。我的命令是否错误;我遗漏了什么吗?原版有两个问题: 您没有保护文本数据中的/不被se

我一直在寻找一种方法来查找和替换我当前目录中所有fortran文件中的字符串。这里的大多数答案都是使用以下方法:

sed -i 's/INCLUDE \'atm/params.inc\'/USE params/g' *.f


但是,当我使用这两个参数中的任何一个时,bash line continuation>会在下一行弹出,就好像它需要输入或其他参数一样。我还没有看到其他人遇到这种情况,我不知道该怎么办。我的命令是否错误;我遗漏了什么吗?

原版有两个问题:

  • 您没有保护文本数据中的
    /
    不被
    sed
    解析,而被视为数据。一种非常可读且明确的方法是使用
    [/]
  • 您试图使用
    \'
    将文本
    '
    放在一个带引号的字符串中。那不行。常见的习惯用法是
    “”
    ,它一个字符接一个字符地执行以下操作:

  • -退出原始单引号上下文
  • -打开双引号上下文
  • -添加文字单引号(受周围双引号保护)
  • -结束双引号上下文
  • -恢复外部单引号上下文
因此,考虑:

# note: this works with GNU sed, not MacOS sed or others
sed -i 's/INCLUDE '"'"'atm[/]params.inc'"'"'/USE params/g' *.f

原始版本存在两个问题:

  • 您没有保护文本数据中的
    /
    不被
    sed
    解析,而被视为数据。一种非常可读且明确的方法是使用
    [/]
  • 您试图使用
    \'
    将文本
    '
    放在一个带引号的字符串中。那不行。常见的习惯用法是
    “”
    ,它一个字符接一个字符地执行以下操作:

  • -退出原始单引号上下文
  • -打开双引号上下文
  • -添加文字单引号(受周围双引号保护)
  • -结束双引号上下文
  • -恢复外部单引号上下文
因此,考虑:

# note: this works with GNU sed, not MacOS sed or others
sed -i 's/INCLUDE '"'"'atm[/]params.inc'"'"'/USE params/g' *.f

BashFAQ#21,at,给出了实现这一点的规范机制。顺便说一句,
sed-i
是一个非标准扩展--
sed
的POSIX标准不能保证它可用,即使它可用,它也可能以不同的方式运行(MacOS X版本无法使用给定的命令)。如果您想编写可移植代码,请考虑使用<代码> EX/CODE >,或者在上述FAQ中指定另一种机制作为标准。您能确认您可以用这里给出的确切命令来复制bug吗?具体来说,
's/old string/new string/g'
,其中
old string
new string
作为文本、精确的源和目标文本(而不是使用这些字符串作为占位符的其他文本)?顺便说一句,这其中的大部分与bash无关--
sed
不是shell的一部分,但是由操作系统提供(这意味着我们不知道
sed-i
应该如何运行,除非我们知道您正在运行的操作系统,并且知道您的shell是bash vs ash,或者在调用
sed
后对该行为没有任何影响)。然而,我的理论是,您正在使用的实际源字符串和目标字符串的解析方式是shell所不期望的,其结果是,
sed
实际上并没有被启动——但如果没有这些实际字符串,我们无法对其进行诊断……是的,这是您的问题
\'
不是在单引号字符串中替换单引号的方式。BashFAQ 21,at,提供了执行此操作的规范机制。顺便说一句,
sed-i
是一个非标准扩展--
sed
的POSIX标准不能保证它可用,即使可用,它也可能以不同的方式运行(MacOS X版本无法与给定的命令配合使用)如果您想编写可移植代码,请考虑使用<代码> EX/COD>,或者作为上述FAQ中的标准给出的另一种机制。您可以确认是否可以用这里给出的确切命令来复制bug?具体地说,<代码> /旧字符串/新字符串/ G′/代码>,用<代码>旧的字符串< /代码>和<代码>新的字符串< /代码>>作为文本、精确的源文本和目标文本(而不是使用这些字符串作为占位符的其他文本)?顺便说一句,其中大部分内容与bash无关--
sed
不是shell的一部分,而是由操作系统提供的(这意味着我们不知道
sed-i
应该如何运行,除非我们知道您正在运行的操作系统,并且知道您的shell是bash vs ash,或者在调用
sed
后对该行为没有任何影响)但是,我的理论是,您正在使用的实际源字符串和目标字符串的解析方式是shell无法预料的,其结果是,
sed
实际上没有启动,但是如果没有这些实际字符串,我们就无法对其进行诊断……是的,这是您的问题。
\
不是如何替换单个qu注意,在一个单引号的字符串中。谢谢,这是我刚刚编辑的问题的一个错误类型。我没有用这种方式键入实际的命令。我不确定您希望看到的其他代码是什么,因为我除了这一个命令之外没有做任何事情。@WhS4,您是否获得了具有确切字符串的给定行为
旧字符串
new-string
?如果没有,您需要构建一个更好的示例。谢谢!这非常有效。我想我应该在开始之前多读一点我的语法,但仍然要感谢您。只是附带说明:我找到了文字/问题的另一个解决方案。sed可以使用任何字符作为分隔符,因此在处理包含/、的字符串时,有些人使用@(altho)