-
cleemy desu wayo authored1715effe
yass-d-sed.py 2.42 KiB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/env python3
#
# ==========================================================================
# yass-d-sed.py -- version 0.0.99.20231020
#
# written by cleemy desu wayo / Licensed under CC0 1.0
#
# official repository: https://gitlab.com/cleemy-desu-wayo/yass
# ==========================================================================
import sys
import re
def error_exit(error_msg):
print(f'ERROR: {error_msg}', file=sys.stderr)
sys.exit(1)
if len(sys.argv) <= 1:
error_exit('lack of sed code')
if not sys.argv[1].isascii():
error_exit('invalid sed code (contains non-ASCII characters)')
if len(sys.argv[1]) % 2 == 1:
error_exit('sed code must have an even number of bytes')
sed_code_list = []
token_list = ['s']
token = ''
mode = ':'
tmp_list = re.split('(..)', sys.argv[1])[1::2]
for i, char_pair in enumerate(tmp_list):
identifier = char_pair[0]
char = char_pair[1]
if i == 0:
if identifier != ':':
error_exit('invalid sed code (1)')
if mode == '_':
if identifier == ':':
token_list = ['s']
token = ''
mode = ':'
else:
error_exit('invalid sed code (2)')
if mode == ':':
if identifier == ':':
token = token + char
elif identifier == '.':
token_list.append(token)
token = ''
mode = '.'
elif identifier == '_':
token_list.append(token)
token_list.append('')
mode = '_'
else:
error_exit('invalid sed code (3)')
if mode == '.':
if identifier == '.':
token = token + char
elif identifier == '_':
token_list.append(token)
mode = '_'
else:
error_exit('invalid sed code (4)')
if identifier == '_':
if char == 'g':
token_list.append('g')
elif char == '_':
token_list.append('')
else:
error_exit('invalid sed code (5)')
sed_code_list.append(token_list)
if mode != '_':
error_exit('invalid sed code (6)')
for line in [s.rstrip('\r\n') for s in sys.stdin]:
replaced_line = line
for token_list in sed_code_list:
if token_list[3] == 'g':
replaced_line = replaced_line.replace(token_list[1], token_list[2])
else:
replaced_line = replaced_line.replace(token_list[1], token_list[2], 1)
print(replaced_line)