代码之家  ›  专栏  ›  技术社区  ›  Valentin H

用两个字符替换一个字符(\n by \r\n)也替换其中一个替换字符

  •  1
  • Valentin H  · 技术社区  · 7 年前

    我正在尝试用这个脚本将大量文件转换为一个公共行结尾。脚本在gitshell中使用for循环调用。

    运行所有行尾后,只有CR作为行尾。我想是因为replace(contents,'\n','\r\n')也会在\r\n之后替换。有可能阻止吗?我应该换行吗?

    import sys
    import string
    import os.path
    
    for file in sys.argv[1:]:
        if not os.path.exists(file):
            continue
        contents = open(file, 'rb').read()
        cont1 = string.replace(contents, '\n', '\r\n' )
        open(file, 'wb').write(cont1)
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   Hkoof    7 年前

    我试过你的代码复制粘贴,它在python2.7上运行得很好:

    bash$ cat file1
    one
    two
    
    bash$ file file1
    file1: ASCII text
    
    bash$ hd file1
    00000000  6f 6e 65 0a 74 77 6f 0a                           |one.two.|
    00000008
    
    bash$ python2 lineend.py file1
    
    bash$ hd file1
    00000000  6f 6e 65 0d 0a 74 77 6f  0d 0a                    |one..two..|
    0000000a
    
    bash$ file file1
    file1: ASCII text, with CRLF line terminators
    

    import sys
    import string
    import os.path
    
    for file in sys.argv[1:]:
        if not os.path.exists(file):
            continue
        f = open(file, 'rb')
        contents = f.read()
        f.close()
        cont1 = string.replace(contents, '\n', '\r\n' )
        open(file, 'wb').write(cont1)
    
        2
  •  1
  •   BitParser    7 年前

    你可以用 re.sub 执行正则表达式替换。

    而不是这一行:

    cont1 = string.replace(contents, '\n', '\r\n' )
    

    你可以用下面这句话(别忘了 import re ):

    cont1 = re.sub(r'([^\r])\n', r'\g<1>\r\n', contents)
    

    r'([^\r])\n' 将不匹配文件开头的换行符。使用 r'([^\r])?\n' 相反,我们应该做这项工作。