UNIX从动态位置

时间:2016-08-20 22:04:43

标签: bash shell unix

我有一个包含大量html文件的目录

我知道为了找到起点,我必须使用以下命令

grep -n -m1 "/header" filename.html| cut -d':' -f1

并找到我的作物的终点我必须使用这个

grep -n -m1 "footer" 39646_20160820.html | cut -d':' -f1

我的问题是:如何使用这两个条件裁剪目录中的所有文件,以使每个文件的作物的开始和结束?

2 个答案:

答案 0 :(得分:0)

删除当前目录中所有文件的/headerfooter之间的所有行:

sed -i.bak '\|/header|,\|footer|d' *

表达式\|/header|,\|footer|定义了一系列行,这些行以包含/header的行开头,并以包含footer的行结束。命令d告诉sed删除这个范围内的所有行。

*是一个glob,它引用当前目录中的所有文件。如果您不想对所有文件进行操作,请更改此glob。

实施例

考虑这个测试文件:

$ cat File
1
/header
2
footer
3

要删除所有以包含/header的行开头并以包含footer的行结尾的行,并将结果显示为stdout:

$ sed '\|/header|,\|footer|d' File
1
3

要就地更新当前目录中的所有文件:

$ sed -i.bak '\|/header|,\|footer|d' *

验证这是否有效:

$ cat File
1
3

备份文件

以上命令创建扩展名为.bak的备份文件。如果您确信该命令正确并且您不想要备份文件,请使用:

sed -i '\|/header|,\|footer|d' *  # GNU/Linux

或者:

sed -i '' '\|/header|,\|footer|d' *  # OSX/BSD

保持范围而不是删除它

要保留范围,请删除所有其他内容:

sed -n '\|/header|,\|footer|p' *

例如,在我们的示例文件中:

$ sed -n '\|/header|,\|footer|p' File
/header
2
footer

将更改保存到文件中:

sed -ni '\|/header|,\|footer|p' *  # GNU/Linux

或者:

sed -ni '' '\|/header|,\|footer|p' *  # OSX/BSD

答案 1 :(得分:0)

此解决方案生成带有页眉和页脚行号的文件名列表 - 生成的列表用于构建在循环内运行的sed命令以裁剪文件 - 裁剪文件在名为destdir的新目录中创建 - 我假设页眉和页脚标记不能嵌套

files=$*
mkdir destdir
#grep header and footer line numbers with filename
grep -Hn -m2 -e'/header' -e'footer' $files|
# join pairs of consecutive lines to get header and footer line numbers on one line
sed -n 'N; s/\n/:/;p'|
# remove header and footer pattern matches and duplicate filename
cut -d: -f1,2,5|
# construct sed command to crop file
while IFS=: read file beg end; do
  echo $file
# remove what's between header and footer
#  sed "$beg,${end}d" $file >destdir/$file
# keep what's between header and footer
sed -n "$beg,${end}p;${end}q" $file >destdir/$file
done