grep: Fix -f FILE when FILE is empty and -x provided
Grep currently special-cased empty pattern file to be the same as pattern file with one empty line (empty pattern). That does mirror how GNU grep behaves, except when -x is provided. In that case .* pattern needs to be used instead. Signed-off-by: Gray Wolf <wolf@wolfsden.cz> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		
				
					committed by
					
						
						Denys Vlasenko
					
				
			
			
				
	
			
			
			
						parent
						
							1c462d47a0
						
					
				
				
					commit
					c3295d233b
				
			@@ -762,8 +762,9 @@ int grep_main(int argc UNUSED_PARAM, char **argv)
 | 
				
			|||||||
	if (option_mask32 & OPT_f) {
 | 
						if (option_mask32 & OPT_f) {
 | 
				
			||||||
		load_regexes_from_file(fopt);
 | 
							load_regexes_from_file(fopt);
 | 
				
			||||||
		if (!pattern_head) { /* -f EMPTY_FILE? */
 | 
							if (!pattern_head) { /* -f EMPTY_FILE? */
 | 
				
			||||||
			/* GNU grep treats it as "nothing matches" */
 | 
								/* GNU grep treats it as "nothing matches" except when -x */
 | 
				
			||||||
			llist_add_to(&pattern_head, new_grep_list_data((char*) "", 0));
 | 
								const char *data = (option_mask32 & OPT_x) ? ".*" : "";
 | 
				
			||||||
 | 
								llist_add_to(&pattern_head, new_grep_list_data((char*)data, 0));
 | 
				
			||||||
			invert_search ^= 1;
 | 
								invert_search ^= 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -129,6 +129,12 @@ testing "grep -v -f EMPTY_FILE" \
 | 
				
			|||||||
	"" \
 | 
						"" \
 | 
				
			||||||
	"test\n"
 | 
						"test\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					testing "grep -vxf EMPTY_FILE" \
 | 
				
			||||||
 | 
						"grep -vxf input" \
 | 
				
			||||||
 | 
						"test\n" \
 | 
				
			||||||
 | 
						"" \
 | 
				
			||||||
 | 
						"test\n"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
testing "grep -Fw matches only words" \
 | 
					testing "grep -Fw matches only words" \
 | 
				
			||||||
	"grep -Fw foo input" \
 | 
						"grep -Fw foo input" \
 | 
				
			||||||
	"" \
 | 
						"" \
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user