将tail -n的输出重新创建为文本文件

时间:2015-12-25 05:51:12

标签: regex bash shell unix

我在一个目录中有一堆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 个答案:

答案 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

缺点:除了最后一个文件外,每个创建文件末尾都有一个空白行。