2015-11-18 11 views
0

我的最終目標是使用sed來自動轉換Makefile。現在,我試圖讓sed將所有出現的<string>.o更改爲c_<string>.o,其中string可能包含字符,數字和下劃線。下面的命令(包含在需要兩個文件名作爲參數的腳本)做這項工作的一部分:sed替換命令:不明白的行爲

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

編輯: 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

如何改變?

如下面給出

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?

因爲最初。是匹配任何單個字符,現在它已經逃脫(\)被視爲文字

+0

這對於簡單的例子很好,但與實際的Makefile我遇到了一個問題,我在編輯的問題中描述。我不清楚我需要在你的'sed'命令中編輯它以使它在那裏工作。 – user1362373