【问题标题】:Extracting lines by pattern matching from multiple files and writing them to another file in linux通过模式匹配从多个文件中提取行并将它们写入linux中的另一个文件
【发布时间】:2016-05-13 07:36:14
【问题描述】:

我有 20 个文件。我想通过匹配模式 '<script src="{%.*%}>' 从这 20 个文件中提取行并将这些行写入新文件。

我还想从原始文件中删除这些行。

除了我尝试过的很糟糕的方法之外,还有更好的方法吗?

这是我的尝试:

import os
import sh

folder_path='/home/username/folder/'
match_phrase = '<script src="{%'
new_file = '/home/username/file.txt'

files = os.listdir(folder_path)
print files
for file in files:
    full_filename = folder_path + file
    lines=[]
    line_nos=[]

    with open(full_filename) as myFile:
        for num, line in enumerate(myFile, 1):
            if match_phrase in line:
                line_nos.append(num)
                lines.append(line)
        print lines
        print line_nos

        with open(new_file,'a') as newfile:
            for line in lines:
                newfile.write(line)

    for del_line in line_nos:
        print "deleting line %s from file=%s"%(del_line,full_filename)
        del_line=str(del_line)+'d'
        sh.sed('-i',del_line,full_filename)

【问题讨论】:

  • 请向我们展示您解决此特定问题的尝试,如果您正在寻找可以为您提供现成代码和教程的平台,堆栈溢出可能是错误的。
  • 是的。我已经在尝试了。如果我能解决它会发布解决方案。
  • 您需要发布您的尝试以获得他人的帮助
  • 我认为对于这样的一般性问题,人们会有方便的解决方案。因此,如果有人之前已经解决了这个问题并且不介意分享,那么我可以节省一些时间。如果没有,那么我无论如何都会尝试一下。

标签: python linux bash


【解决方案1】:

使用sed

sed -i -e "/$pattern/w $newfile" -e "/$pattern/d" $files

Sedw 命令将匹配写入其他文件。 d 删除它。


示例:

$ pattern='<script src="{%'
$ files=/home/username/folder/*
$ newfile=/home/username/file.txt
$ 
$ sed -i -e "/$pattern/w $newfile" -e "/$pattern/d" $files

【讨论】:

  • 这在 bash 的 for 循环中不起作用。得到错误: 1.无法读取文件。 2.文件名太长。
  • 这对我不起作用::: for a in ls;做 sed -i -e "/$pattern/w $newfile" -e "/$pattern/d" $a;完成
  • 您不需要 for 循环。你的变量中有什么?
猜你喜欢
  • 2020-01-25
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多