如何使用sed或awk合并分隔符间文本并格式化输出内容
Solution for Text Processing Task
Got it, let's work through this text processing task together. I've put together a Python script that hits all your requirements perfectly—here's how it works:
Python Script Implementation
import re # Read the input file content with open('input.txt', 'r') as input_file: raw_content = input_file.read() # Step 1: Remove newlines surrounding the '------' separator patterns # Matches any sequence of 5+ dashes with optional newlines before/after processed_content = re.sub(r'\n*(-{5,})\n*', r'\1', raw_content) # Step 2: Delete all the '------' separator patterns entirely processed_content = re.sub(r'-{5,}', '', processed_content) # Step 3 & 4: Reformat print_me lines and insert printername entries def transform_print_me_block(match): # Capture the numeric identifier and the following text identifier = match.group(1) text_content = match.group(2).strip() # Create the required printername line printername_line = f"printername('{identifier}')" # Reformat print_me into the function call format formatted_print_me = f"print_me({identifier} {text_content})" return f"{printername_line}\n{formatted_print_me}" # Find all print_me blocks and apply the transformation processed_content = re.sub( r'print_me (\d+) (.*?)(?=\s*print_me|$)', transform_print_me_block, processed_content, flags=re.DOTALL ) # Write the final processed content to an output file with open('output.txt', 'w') as output_file: output_file.write(processed_content)
Step-by-Step Breakdown
Let's walk through exactly what each part does, matching your requirements:
- Remove newlines around '------': The first regex targets any number of newlines before/after a line of 5+ dashes, replacing them with just the dashes. This eliminates line breaks between your content blocks and the separators.
- Delete '------' patterns: The second regex wipes out all those dashed separators completely.
- Reformat print_me lines: The final regex captures each
print_me [number] [text]block. We then rewrite it into theprint_me([number] [text])function call format you need. - Insert printername lines: For each captured print_me block, we generate a new line
printername('[number]')and place it directly above the reformatted print_me line.
Example Input/Output
Input (from input.txt):
print_me 0034 bla bla bla bla bla bla bla bla bla. ------ ------------------------- print_me 0035 bla bla bla bla bla bla bla bla bla. ------ --------------
Output (written to output.txt):
printername('0034') print_me(0034 bla bla bla bla bla bla bla bla bla.) printername('0035') print_me(0035 bla bla bla bla bla bla bla bla bla.)
Quick Tips
- If your separators are exactly 6 dashes every time, change
-{5,}to-{6}for a more precise match. - If your text blocks include special characters or edge cases, just tweak the regex capture group slightly—feel free to ask for help adjusting it!
内容的提问来源于stack exchange,提问作者pixie
相关产品推荐
相关产品推荐

