我有一个包含大量html文件的目录
我知道为了找到起点,我必须使用以下命令
grep -n -m1 "/header" filename.html| cut -d':' -f1
并找到我的作物的终点我必须使用这个
grep -n -m1 "footer" 39646_20160820.html | cut -d':' -f1
我的问题是:如何使用这两个条件裁剪目录中的所有文件,以使每个文件的作物的开始和结束?
答案 0 :(得分:0)
删除当前目录中所有文件的/header
和footer
之间的所有行:
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