我的最终目标是使用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仍然有效)。
我的问题是:
sed
命令,以便仅在<string>
包含至少一个字符并且排除包含%
的任何字符串时才会激活替换?sed
命令在不包含扩展名mycode
时会更改.o
? 编辑: 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
答案 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?
因为最初的。匹配任何单个字符,现在它已被转义(\)
被视为文字