2017-08-12 94 views
-2

這是實例。迭代文件並使用shell腳本替換多重命令

我有多個輸入的屬性,如下所示:

$Prop1 = value1; 
$Prop2 = value2; 
$Prop3 = value3; 

,並與下面的內容幾個txt文件(文件具有不同的內容,但格式是相同的)與幾個子文件夾的文件夾下: 文件位於包含少量子文件夾的文件夾中。

{{Prop1}}.{{Prop2}} 
{{Prop2}}-{{Prop3}} 
{{Prop1}}:{{Prop4}}:{{Prop2}}-{{Prop4}} 
${Argument1} = {{Prop1}}.{{Prop2}}.{{Prop3}}.{{Prop4}} 

可能有的請幫助我解決下一個案例:

  1. 迭代通過文件夾和子發現,與* .TXT
  2. 對於所有受資助的文件結尾的文件,「{{道具*} }「應替換爲相應的$ Prop *值。例如:「{{Prop1}}」應該變成「value1」
  3. 如果「{{Prop *}}」不存在(在我們的例子中「{{Prop4}}」)不會取代任何內容並引發錯誤
  4. 「$ {參數*}」不應該被感動,並應保持不變
  5. 原始文件不應該被改變,以更換新的文件應該在其他位置預先建立

感謝

UPD:

+0

請添加你的代碼以及迄今爲止已經嘗試過的內容,這將使人們能夠幫助你。 – Stuart

+1

爲什麼你有這個標籤'ruby'? – dawg

+0

此代碼無效的Ruby代碼。請清理您的代碼,並確保它在發佈之前至少解析正確! –

回答

1

Perl可以處理這種條件搜索&的替代

#!/bin/bash 

Prop1=value1 
Prop2=value2 
Prop3=value3 

export Prop1 Prop2 Prop3 

shopt -s globstar 

perl -i.bak -pe ' 
    s[ (\{\{ (.+?) \}\}) ] 
    [ 
     if (exists $ENV{$2}) { 
      $ENV{$2} 
     } else { 
      warn "unknown property $2 in file $ARGV\n"; 
      $1 
     } 
    ]gex 
' **/*.txt 

e標誌的s///命令允許您運行在替換塊

任意Perl代碼運行它:

$ bash replace_props.sh 
unknown property Prop4 in file sub1/file.txt 
unknown property Prop4 in file sub1/file.txt 
unknown property Prop4 in file sub1/file.txt 
$ cat sub1/file.txt 
value1.value2 
value2-value3 
value1:{{Prop4}}:value2-{{Prop4}} 
${Argument1} = value1.value2.value3.{{Prop4}} 
+0

謝謝,@glenn jackman。完美的作品 – Andriy