linux shell遍历当前文件夹中的txt文件并处理生成新的文件

问题描述:当前文件夹中有a.txt,b.txt,c.txt,d.txt等文件,且这些txt文件中的某些行包含有关键字《keywords》和《/keywords》,他们之间... 问题描述:当前文件夹中有a.txt,b.txt,c.txt,d.txt 等文件,且这些txt文件中的某些行包含有关键字《keywords》和《/keywords》,他们之间包含有其他字符串(注:《keywords》和《/keywords》不一定在同统一行)
要求:分别从这些txt文件中将《keywords》。。。《/keywords》中所有字符串原封不动的分别追加到文件夹 ./newfile中的四个文件,即./newfile/a.txt,./newfile/b.txt,./newfile/c.txt,./newfile/d.txt。
比如说a.txt中为:
fdjs sdfsdfs
《keywords》sdkfjsd《/keywords》
aflsdfsd
《keywords》dsdgfsd
dsfd《/keywords》
那么处理后在./newfile/a.txt中保存为:
《keywords》sdkfjsd《/keywords》
《keywords》dsdgfsd
dsfd《/keywords》
跪求高人指点,感激不尽!!!
展开
 我来答
百度网友5311d79
推荐于2016-09-22 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3143万
展开全部

先以a.txt为例:

awk -v RS="" '{ 
n = split($0,a,"《[^》]+》");
for(i=2;i<n;i+=2)
    print "《keywords》"a[i]"《/keywords》" 
}' a.txt >>./newfile/a.txt

这样就行了。

为了可读性,我将一条awk语句写成了多行。

 

实际测试结果如下:

 

解说:

RS=""

将awk的记录分隔符设置为空(默认是换行符),即将整个a.txt文本看做一条记录。

n = split($0,a,"《[^》]+》");

以正则"《[^》]+》"匹配的内容作为分隔符,对文本内容进行分割并将分割结果存入数组a,分割出的数目(数组大小)即为split函数的返回值n。这里暂且不对该正则做过多解释,否则喧宾夺主,有需要请追问,我再补充。

for(i=2;i<n;i+=2)
    print "《keywords》"a[i]"《/keywords》"

打印数组下标为偶数的元素并在首尾分别加上关键字标记以还原。数组下标从1开始。

 

其他文件可作相同处理。如果文件较多,你可以搞个循环去做。这个应该不难。

更多追问追答
追问
如何循环读取当前文件夹中的所有.txt文件?一直没找到这样的例子。
追答

这种应用其实很常见。

for ofile in *.txt
do
    awk -v RS="" '{n=split($0,a,"《[^》]+》");for(i=2;i<n;i+=2)print "《keywords》"a[i]"《/keywords》"}' $ofile >>./newfile/$ofile
done

 

*.txt 就代表当前目录下所有txt文件的一个集合。

*在这里是通配符,shell解释器会将其自动展开。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式