2015-12-25 156 views
2

我在我「備份」目錄一堆的bash腳本的做$ tail -n +1 -- *.sh重新創建輸出文本文件

尾巴的輸出是一樣的東西:

==> do_stuff.sh <== 
#! /bin/bash 
cd ~/my_dir 
source ~/my_dir/bin/activate 
python scripts/do_stuff.py 


==> do_more_stuff.sh <== 
#! /bin/bash 
cd ~/my_dir 
python scripts/do_more_stuff.py 

這些都是相當簡單的2-10行的腳本。 鑑於tail的輸出,我想用相同的內容重新創建上述所有文件。 也就是說,我正在尋找一個可以攝取上述文本的命令,並使用適當的內容創建do_stuff.shdo_more_stuff.sh

這更多的是一次性的任務,所以我並不需要強大的任何東西,我相信在文件很簡單的情況下(例如,其中沒有任何文件實際上包含==>)沒有大的優勢)。

我開始試圖想出一個匹配的正則表達式,它可能看起來像這樣(==>.*\.sh <==)(.*)(==>.*\.sh <==),但我堅持實際獲取它來捕獲文件名,內容和輸出到文件。

任何想法?

回答

2

假設你的備份文件被命名爲Backup.txt

perl -ne "if (/==> (\S+) <==/){open OUT,'>',$1;next}print OUT $_" backup.txt 

以上的版本是Windows

固定版本在* nix:

perl -ne 'if (/==> (\S+) <==/){open OUT,">",$1;next}print OUT $_' backup.txt 
+0

請修復報價。 Bash取代'$ 1'。 – Cyrus

1
#!/bin/bash 

while read -r line; do 
    if [[ $line =~ ^==\>[[:space:]](.*)[[:space:]]\<==$ ]]; then 
    out="${BASH_REMATCH[1]}" 
    continue 
    fi 
    printf "%s\n" "$line" >> "$out" 
done < backup.txt 

缺點:額外的空行在除了最後一個之外的每個創建的文件的末尾。