Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- from typing import List
- import sys
- import re
- import argparse
- def parse_args(args_str: List[str]):
- parser = argparse.ArgumentParser()
- parser.add_argument('needle', type=str)
- parser.add_argument('files', nargs='*')
- parser.add_argument('-E', dest='regex', action='store_true')
- parser.add_argument('-c', dest='count', action='store_true')
- return parser.parse_args(args_str)
- def main(args_str: List[str]) -> None:
- args = parse_args(args_str)
- if not args.regex:
- args.needle = re.escape(args.needle)
- if not args.files:
- lines_in_stdin(args.needle, args.count)
- else:
- lines_in_files(args.needle, args.count, args.files)
- def lines_in_stdin(pattern: str, count: bool) -> None:
- lines = []
- for line in sys.stdin.readlines():
- save_line(lines, line, pattern)
- print_single_input(lines, count)
- def lines_in_files(pattern: str, count: bool, files: List[str]) -> None:
- lines = []
- for file in files:
- with open(file, 'r') as in_file:
- for line in in_file.readlines():
- save_line(lines, line, pattern)
- print_line_in_file(lines, file, line, bool(len(files) - 1), count)
- def save_line(lines: List[str], line: str, pattern: str) -> None:
- line = line.rstrip('\n')
- if re.search(pattern, line):
- lines.append(line)
- def print_single_input(lines: List[str], count: bool) -> None:
- if count:
- print(len(lines))
- else:
- for line in lines:
- print(line)
- def print_line_in_file(lines: List[str], file: str, line: str, files_hz_kak_nazvat: bool, count: bool) -> None:
- if files_hz_kak_nazvat:
- print_in_many_inputs(file, lines, count)
- lines.clear()
- else:
- print_single_input(lines, count)
- def print_in_many_inputs(file: str, lines: List[str], count: bool) -> None:
- if not count:
- for line in lines:
- print(file + ':' + line)
- else:
- print(file + ':' + str(len(lines)))
- if __name__ == '__main__':
- main(sys.argv[1:])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement