sed替换命令:不了解行为

时间:2015-11-18 10:15:04

标签: sed

我的最终目标是使用sed自动转换Makefile。现在,我正试图让sed将所有<string>.o更改为c_<string>.o,其中string可能包含字符,数字和下划线。以下命令(包含在需要两个文件名作为参数的脚本中)执行作业的一部分:

sed -E 's/([a-z,A-Z,0-9_]*.o)/c_\1/g' <$1 >$2 

对包含内容的文件进行操作

bye.o
bye1.o
bye_again.o
mycode
-o
%.o

我得到了

c_bye.o
c_bye1.o
c_bye_again.o
c_mycode
c_-o
%c_.o

但当然最后三行不正确。我需要它们保持不变(这样我的目标名称不变,Makefile仍然有效)。

我的问题是:

  1. 如何更改上面给出的sed命令,以便仅在<string>包含至少一个字符并且排除包含%的任何字符串时才会激活替换?
  2. 为什么上面给出的sed命令在不包含扩展名mycode时会更改.o
  3. 编辑: realspiritual的答案在我上面给出的示例文件中效果很好,但是当我在我的实际Makefile上尝试sed命令时,我遇到了依赖项的问题部分(我知道这可以由C编译器自动生成,但我需要手动指定依赖项)。在那里,我得到以下示例:

    hello.o: file1.o file2.o\
            file3.o
    

    输出:

    c_hello.o:c_ file1.oc_ file2.o\
    c_      file3.o
    

    而我需要的是:

    c_hello.o: c_file1.o c_file2.o\
            c_file3.o
    

1 个答案:

答案 0 :(得分:1)

如何改变?

如下所示

sed -E 's/([^%][a-z,A-Z,0-9_]*\.o)/c_\1/g' <$1 >$2 

说明:

  • "([^%][a-z,A-Z,0-9_]*\.o)"第一捕获小组([^%][a-z,A-Z,0-9_]*\.o)
  • [^%]匹配%文字字符%
  • 下方列表中的单个字符 目前
  • [a-z,A-Z,0-9_]*匹配下面列表中的单个字符

    • 量词:
    • *在零和无限次之间,尽可能多次,根据需要回馈[贪婪]
    • a-z a和z之间范围内的单个字符(区分大小写)
    • ,文字,
    • A-Z A和Z之间范围内的单个字符(区分大小写)
    • ,文字,
    • 0-9 0到9之间范围内的单个字符
    • _文字_
    • \.字面匹配字符.
    • o字面匹配字符o(区分大小写)

为什么它不包含.o?

因为最初的。匹配任何单个字符,现在它已被转义(\)被视为文字