我在一个目录中有一堆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.sh
和do_more_stuff.sh
。
这更像是一次性任务,所以我真的不需要任何强大的东西,我相信没有大的边缘情况,因为文件很简单(例如,其中没有文件实际包含==>
)
我开始尝试提出一个匹配的正则表达式,它可能看起来像这个(==>.*\.sh <==)(.*)(==>.*\.sh <==)
,但我实际上是为了捕获文件名,内容和输出到文件。
有什么想法吗?
答案 0 :(得分: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
答案 1 :(得分: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
缺点:除了最后一个文件外,每个创建文件末尾都有一个空白行。