Python 如何在空行后插入字符

Python 如何在空行后插入字符,python,regex,bash,sed,awk,Python,Regex,Bash,Sed,Awk,我正在寻找一种在每行开头添加$字符的快速方法 在文件的每一个空行之后。 示例:输入文件 text1 text2 text3 text4 text5 输出文件示例: text1 $text2 text3 $text4 text5 试一试 假设行是您的行列表: fixit = False for line in lines: if fixit and line.strip(): line = "$" + line

我正在寻找一种在每行开头添加$字符的快速方法 在文件的每一个空行之后。 示例:输入文件

text1  

text2    
text3  

text4  
text5 
输出文件示例:

text1  

$text2    
text3  

$text4  
text5
试一试

假设行是您的行列表:

fixit = False
for line in lines:
    if fixit and line.strip():
        line = "$" + line
    fixit = (line.strip() == "")
    print line
fixit=line.strip==是检查当前行是否为空的测试。[.strip方法删除行的开头和结尾处的所有空白字符,\n,…]

如果一行中有两个空行,if fixit and line.strip可避免在第二个空行的开头打印$。

print openinput.txt.read.replace'\n\n','\n\n$'

给予

更新: 适用于处理多个连续空白:

awk '""~$0 {flag=1; print; next}; flag {printf "$"; flag=0} 1'

GNU sed的另一种方式:

sed -rn '1 h; 1!H; $ {x; s/(\n\n)(.)/\1$\2/g; p}' infile
并附上评论:

sed -rn '
  1h                     # First collect all input 
  1!H                    # in the hold space 
  $ {
    x                    # Swap hold space and pattern space
    s/(\n\n)(.)/\1$\2/g  # Globally insert $ after empty lines
    p                    # Print the result
  }'

正如potong在评论中所指出的,此解决方案将所有输入加载到内存中,这可能会因输入的大小而出现问题。

BTW在第一个解决方案中生成错误答案的反向引用不需要,因为可能会被使用。此解决方案将整个文件拖到内存中,因此如果文件较大,可能会导致问题。也就是说,可能是sed'1h;1.H、 美元!Dx;s/\n\n/&$/g'文件可能更清晰。啊,忘了更新压缩解决方案[Fixed]。我使用了back引用,因此它也支持连续的空行。你关于内存使用的评论很重要,我会把它添加到答案中。
awk '""~$0 {flag=1; print; next}; flag {printf "$"; flag=0} 1'
sed -rn '1 h; 1!H; $ {x; s/(\n\n)(.)/\1$\2/g; p}' infile
sed -rn '
  1h                     # First collect all input 
  1!H                    # in the hold space 
  $ {
    x                    # Swap hold space and pattern space
    s/(\n\n)(.)/\1$\2/g  # Globally insert $ after empty lines
    p                    # Print the result
  }'