| 
					
				 | 
			
			
				@@ -43,10 +43,10 @@ def grep(filename, pattern, numbers=False): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def sed(filename, sed_cmd, bak_ext=".bak"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   # parse the sed_cmd 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   # group 1,3 are the n-start, n-end    group 4 is command: aidsxX 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  a=re.search("^(\d*)([,-](\d+|\$))?\s*([sdaixX].*)",sed_cmd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  a=re.search("^(\d*)([,-](\d+|\$))?\s*([sdaixX])(.*)",sed_cmd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if not a: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     raise ValueError("sed() failed; pattern must be a number-range followed by one of sdaixX; no changes applied") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  cmd=a.group(4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  op,args=a.group(4),a.group(5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   s,e=1,1000000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if a.group(1): 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -54,26 +54,25 @@ def sed(filename, sed_cmd, bak_ext=".bak"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if a.group(3): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     e=1000000 if a.group(3)=='$' else int(a.group(3)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  op=cmd[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if op in "aid" and e-s==1000000: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     raise ValueError("sed(a/i/d) should have a line number") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   #print("sed command parser of <{}> returned {} {} {}".format(op,cmd,a.group(1),a.group(3))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if op in "sxX": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if len(cmd)<2 or cmd[1] in "\^$()[]":  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      raise ValueError("invalid sed argument: {}".format(cmd)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    dl=cmd[1] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if len(args)<2 or args[0] in "\^$()[]":  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      raise ValueError("invalid sed argument: "+op+args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    dl=args[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if op=='s': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      gs=re.search("s"+dl+"([^"+dl+"]*)"+dl+"([^"+dl+"]*)"+dl,cmd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gs=re.search(dl+"([^"+dl+"]*)"+dl+"([^"+dl+"]*)"+dl,args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      gs=re.search("[xX]"+dl+"([^"+dl+"]*)"+dl,cmd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gs=re.search(dl+"([^"+dl+"]*)"+dl,args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if not gs: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      raise ValueError("invalid sed search pattern: {}".format(cmd)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      raise ValueError("invalid sed search pattern: "+op+args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ss=gs.group(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if op=='s': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       r=gs.group(2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     sp=re.compile(ss)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  extra=a.group(4)[1:] + '\n'  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  args=args + '\n'  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     os.rename(filename,filename+bak_ext) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -95,7 +94,7 @@ def sed(filename, sed_cmd, bak_ext=".bak"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           continue   # delete line 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if op=='i' and m: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           #print("insert a line before {} <{}>".format(i,extra)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          g.write(extra) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          g.write(args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           h+=1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if op in "aids": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           g.write(lin) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -104,7 +103,7 @@ def sed(filename, sed_cmd, bak_ext=".bak"): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           h+=1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if op=='a' and m: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           #print("append a line after {} <{}>".format(i,extra))        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          g.write(extra) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          g.write(args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           h+=1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       #f.write("--file modifed by sed()--\n") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return (i, h) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -139,15 +138,16 @@ def _help(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ext_cmd('help') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def parseQuotedArgs(st): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  #returns (pattern,file) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   st=st.strip()   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if st[0]=="'": 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    p=re.search("'(.*?[^\\\\])'",st) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    p=re.search("'(.*?[^\\\\])'\s*(\S*)",st) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if not p: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       print("error in quoted pattern:",st) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return p.group(1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return p.group(1),p.group(2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return st.split()[0] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return st.split(None,1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def main(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   print("Simple shell: cp/copy mv/move rm/del cat/list cd dir/ls mkdir rmdir grep sed help") 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -183,9 +183,9 @@ def main(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       try: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if op=='grep': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          grep(rp[-1],p,numbers=True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          grep(p[1],p[0],numbers=True) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          r=sed(rp[-1],p) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          r=sed(p[1],p[0]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           if r: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             print("Lines processed: {}  Lines modifed: {}".format(*r)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       except (ValueError, OSError) as e: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -216,7 +216,7 @@ def main(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       except IndexError: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         print("not enough argments; check syntax with 'help'") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       except OSError: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        print("file/folder not found or cannot be writtencd") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        print("file/folder not found or cannot be written") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     gc.collect() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 if __name__=="tf": 
			 |