Advertisement
_Bad_Liar_

grep2.py

Nov 15th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.17 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. from typing import List
  3. import sys
  4. import re
  5. import argparse
  6.  
  7.  
  8. def parse_args(args_str: List[str]) -> argparse.Namespace:
  9.     parser = argparse.ArgumentParser()
  10.     parser.add_argument('needle', type=str)
  11.     parser.add_argument('files', nargs='*')
  12.     parser.add_argument('-E', dest='regex', action='store_true')
  13.     parser.add_argument('-c', dest='counting', action='store_true')
  14.     args = parser.parse_args(args_str)
  15.     return args
  16.  
  17.  
  18. def print_in_files(files_amount: bool, file: str, parametr: str) -> None:
  19.     print(f'{file}:{parametr}' if files_amount else parametr)
  20.  
  21.  
  22. def output_in_files(files_amount: bool, lines: List[str], file: str) -> None:
  23.     for line in lines:
  24.         print_in_files(files_amount, file, line)
  25.  
  26.  
  27. def output_in_stdin(lines: List[str]) -> None:
  28.     for line in lines:
  29.         print(line)
  30.  
  31.  
  32. def add_to_list(lines: List[str], line: str, needle: str) -> None:
  33.     line = line.rstrip('\n')
  34.     if re.search(needle, line):
  35.         lines.append(line)
  36.  
  37.  
  38. def making_list_in_file(file: str, needle: str) -> list:
  39.     lines = []
  40.     with open(file, 'r') as in_file:
  41.         for line in in_file:
  42.             add_to_list(lines, line, needle)
  43.     return lines
  44.  
  45.  
  46. def making_list_in_stdin(needle: str) -> list:
  47.     lines = []
  48.     for line in sys.stdin.readlines():
  49.         add_to_list(lines, line, needle)
  50.     return lines
  51.  
  52.  
  53. def search_in_file(files: List[str], needle: str, counting: bool) -> None:
  54.     for file in files:
  55.         lines = making_list_in_file(file, needle)
  56.         lines = [str(len(lines))] if counting else lines
  57.         output_in_files(bool(len(files) > 1), lines, file)
  58.  
  59.  
  60. def search_in_stdin(needle: str, counting: bool) -> None:
  61.     lines = making_list_in_stdin(needle)
  62.     lines = [str(len(lines))] if counting else lines
  63.     output_in_stdin(lines)
  64.  
  65.  
  66. def main(args_str: List[str]) -> None:
  67.     args = parse_args(args_str)
  68.     needle = args.needle if args.regex else re.escape(args.needle)
  69.     if args.files:
  70.         search_in_file(args.files, needle, args.counting)
  71.     else:
  72.         search_in_stdin(needle, args.counting)
  73.  
  74.  
  75. if __name__ == '__main__':
  76.     args = main(sys.argv[1:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement