使用python或bash在多行文件中查找和替换模式

时间:2018-07-27 19:32:34

标签: python linux bash unix

我有这样的文字:

   \/::360::__/
    |::559:::|  |
 ::468::\:\~\:\ \/__/
 /:/\:\  /::390::\__\
::138::
  ::380::  /:/  \/__/
     /::144::\  \
    /::\ ::145:: \
::418::      ___
      ::539::___
     \|::483::__|

这里使用\|_进行了一些模式设置。每行在某个随机位置添加格式为::539::等的行号。 我想首先根据给定的行号对所有行进行排序,然后从每行中删除**::line-number::**以获得实际标志。

(实际问题有600条,随机排列。需要对它们进行适当的剥离以找到标记。)

The actual complete text file link

我已经发布了如下使用的python代码。

#!/usr/bin/python3
# import sys
with open( 'sorted.txt'  ) as file:
    randlst =[0] * 600
    for line in file:
        num=''
        strng=''
        for each in line:
            if each.isdigit():
                num += each
            else:
                strng += each
        strng = strng.strip('::::')
        num = int(num)
        randlst.insert(num,strng)
    for i in range(600):
        if randlst[i] !=0:
            print(str(randlst[i]).replace('::::',''))

在这段代码中,sorted.txt文件是在使用bash对实际输入文件(在上面的链接中给出)进行排序后生成的,因为我认为在python中进行排序会变得很困难。

问题在于,如您在此处看到的那样,bash进行的排序并不完全准确:

      ::0:: ___
    ::1:: /\__\
     \/__::10::/
     /\  \::100::
    /::\ ::101:: \
   ::102::/:/\:\  \
  /:/  \:\::103::  \

由于这个小错误,最终输出没有几个字母,我的提交被拒绝了。

请指出我该如何改善(我不了解正则表达式,对不起如此糟糕的脚本)。

或者,您可以建议使用bash命令来执行此工作,而不是使用python吗?

3 个答案:

答案 0 :(得分:-1)

这将根据数字对行进行排序,并将其写入标准输出(将::<number>::替换为''):

data = r"""   \/::360::__/
    |::559:::|  |
 ::468::\:\~\:\ \/__/
 /:/\:\  /::390::\__\
::138::
  ::380::  /:/  \/__/
     /::144::\  \
    /::\ ::145:: \
::418::      ___
      ::539::___
     \|::483::__|"""


import re
for s1, _, s2 in sorted(re.findall(r'^(.*?)(?:::)(\d+)(?:::)(.*?)$', data, flags=re.M), key=lambda v: int(v[1])):
    print(s1 + s2)

打印:

     /\  \
    /::\  \
   \/__/
    /:/  \/__/
 /:/\:\  /\__\
      ___
 \:\~\:\ \/__/
     \|__|
      ___
    |:|  |

答案 1 :(得分:-1)

这是一个python解决方案,它根据嵌入的行号对行进行排序,然后剥离这些行号并打印出图案

>>> print(s)
   \/::360::__/ 
    |::559:::|  | 
 ::468::\:\~\:\ \/__/ 
 /:/\:\  /::390::\__\ 
::138:: 
  ::380::  /:/  \/__/ 
     /::144::\  \ 
    /::\ ::145:: \ 
::418::      ___ 
      ::539::___ 
     \|::483::__| 
>>> 
>>> 
>>> sorted_s ='\n'.join(sorted(s.splitlines(), key=lambda x: int(re.findall(r'\d+', x)[0])))
>>> print (re.sub(r'::\d+::', '', sorted_s))

     /\  \ 
    /::\  \ 
   \/__/ 
    /:/  \/__/ 
 /:/\:\  /\__\ 
      ___ 
 \:\~\:\ \/__/ 
     \|__| 
      ___ 
    |:|  | 
>>> 

尝试使用G_M用户创建的页面https://bpaste.net/raw/5379781c4ee8的内容时,这就是我们所得到的

>>> import requests
>>> import re
>>> 
>>> r = requests.get('https://bpaste.net/raw/5379781c4ee8')
>>> s = r.text
>>> sorted_s ='\n'.join(sorted(s.splitlines(), key=lambda x: int(re.findall(r'\d+', x)[0])))
>>> print (re.sub(r'::\d+::', '', sorted_s))
      ___
     /\__\
    /::|  |
   /:|:|  |
  /:/|:|__|__
 /:/ |::::\__\
 \/__/~~/:/  /
       /:/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\__\
    /:/  /
   /:/__/
  /::\__\____
 /:/\:::::\__\
 \/_|:|~~|~
    |:|  |
    |:|  |
    |:|  |
     \|__|

      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/

      ___
     /\__\
    /::|  |
   /:|:|  |
  /:/|:|  |__
 /:/ |:| /\__\
 \/__|:|/:/  /
     |:/:/  /
     |::/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/_\:\__\
 \:\  /\ \/__/
  \:\ \:\__\
   \:\/:/  /
    \::/  /
     \/__/











      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\ \  \
  _\:\~\ \  \
 /\ \:\ \ \__\
 \:\ \:\ \/__/
  \:\ \:\__\
   \:\/:/  /
    \::/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \  \/__/
  \:\  \
   \:\  \
    \:\__\
     \/__/

      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/


      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/












      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/_|::\/:/  /
    |:|::/  /
    |:|\/__/
    |:|  |
     \|__|
      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/














      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/

      ___
     /\  \
    /::\  \
   /:/\ \  \
  _\:\~\ \  \
 /\ \:\ \ \__\
 \:\ \:\ \/__/
  \:\ \:\__\
   \:\/:/  /
    \::/  /
     \/__/











      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/











      ___
     /\__\
    /:/  /
   /:/__/
  /::\__\____
 /:/\:::::\__\
 \/_|:|~~|~
    |:|  |
    |:|  |
    |:|  |
     \|__|
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \:\~\:\ \/__/
  \:\ \:\__\
   \:\ \/__/
    \:\__\
     \/__/
      ___
     |\__\
     |:|  |
     |:|  |
     |:|__|__
     /::::\__\
    /:/~~/~
   /:/  /
   \/__/













      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
       \/__/


      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/_|::\/:/  /
    |:|::/  /
    |:|\/__/
    |:|  |
     \|__|
      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/













      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \ /:/  /
  \:\  /:/  /
   \:\/:/  /
    \::/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\ \/__/
      \:\__\
       \/__/













      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/


      ___
     /\__\
    /:/  /
   /:/__/
  /::\  \ ___
 /:/\:\  /\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \:\~\:\ \/__/
  \:\ \:\__\
   \:\ \/__/
    \:\__\
     \/__/











      ___
     /\__\
    /:/  /
   /:/__/
  /::\  \ ___
 /:/\:\  /\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/__\:\/:/  /
      \::/  /
      /:/  /
     /:/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \  \/__/
  \:\  \
   \:\  \
    \:\__\
     \/__/
      ___
     /\__\
    /:/  /
   /:/__/
  /::\__\____
 /:/\:::::\__\
 \/_|:|~~|~
    |:|  |
    |:|  |
    |:|  |
     \|__|
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \:\~\:\ \/__/
  \:\ \:\__\
   \:\ \/__/
    \:\__\
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /::\~\:\  \
 /:/\:\ \:\__\
 \/_|::\/:/  /
    |:|::/  /
    |:|\/__/
    |:|  |
     \|__|
      ___
     /\  \
    /::\  \
   /:/\ \  \
  _\:\~\ \  \
 /\ \:\ \ \__\
 \:\ \:\ \/__/
  \:\ \:\__\
   \:\/:/  /
    \::/  /
     \/__/











      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/


      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \ /:/  /
  \:\  /:/  /
   \:\/:/  /
    \::/  /
     \/__/
      ___
     /\  \
    /::\  \
   /:/\:\  \
  /:/  \:\  \
 /:/__/ \:\__\
 \:\  \ /:/  /
  \:\  /:/  /
   \:\/:/  /
    \::/  /
     \/__/
      ___
     /\__\
    /:/  /
   /:/  /
  /:/  /
 /:/__/
 \:\  \
  \:\  \
   \:\  \
    \:\__\
     \/__/
      ___
     /\__\
    /:/  /
   /:/__/
  /::\__\____
 /:/\:::::\__\
 \/_|:|~~|~
    |:|  |
    |:|  |
    |:|  |
     \|__|

      ___
     /\  \
     \:\  \
     /::\__\
  __/:/\/__/
 /\/:/  /
 \::/__/
  \:\__\
   \/__/

      ___
     /\  \
     \:\  \
      \:\  \
      /::\  \
     /:/\:\__\
    /:/  \/__/
   /:/  /
   \/__/

答案 2 :(得分:-1)

尽管标题为bash,但您在问题上放置了Python标记,因此这是在Python中解决此问题的一种方法。我必须创建一个openlearning帐户才能从您的链接中获取文本,但是我将其粘贴为下面的输入文本。

"MAKING ASCII ART IS A KEY PART OF THE HACKERS TOOLKIT"

import re

regex = re.compile(r'(.*)(?:::(\d+)::)(.*)')

with open('file_1', 'r') as f:
    d = {}
    for line in f:
        m = regex.match(line.rstrip())
        beg, num, end = m.groups()
        d[int(num)] = beg + end

for _, v in sorted(d.items()):
    print(v)