013231
V2EX  ›  问与答

去掉文件末尾的换行符, 怎么做最方便?

  •  
  •   013231 · Mar 27, 2012 · 16049 views
    This topic created in 5336 days ago, the information mentioned may be changed or developed.
    现在有一批文件, 需要检测文件末尾, 如果末尾是换行符('\n'), 就把那个换行符删除.
    为了实现这个目的, 怎样做最方便?
    32 replies  •  2020-02-13 21:53:26 +08:00
    Muninn
    Muninn
    Mar 27, 2012
    1
    ue之类的编辑器替换
    甚至word都能替换
    RustingSword
    RustingSword
    Mar 27, 2012
    2
    sed
    gujiaxi
    gujiaxi
    Mar 27, 2012
    3
    sed
    013231
    013231
    OP
    Mar 27, 2012
    4
    @gujiaxi @RustingSword sed应该怎么做? 就算没有换行符, sed输出一行时也会加上一个换行符. 如何禁止sed自动添加换行符?
    013231
    013231
    OP
    Mar 27, 2012
    5
    @yuhuofeihe @Muninn 我需要一个自动化的解决方案.
    66450146
    66450146
    Mar 27, 2012
    6
    013231
    013231
    OP
    Mar 27, 2012
    7
    @66450146 此命令对文件末尾的'\n'无效.
    Muninn
    Muninn
    Mar 27, 2012
    8
    汗...我还没见过到研究sed层次的人不会做这个...
    chone
    chone
    Mar 27, 2012
    9
    不用sed其他任意一种可以用正则的方式总行吧。
    yuhuofeihe
    yuhuofeihe
    Mar 27, 2012
    10
    首选word~
    lackrp
    lackrp
    Mar 27, 2012
    11
    cat <filename> | perl -pe 'chop if eof'
    why
    why
    Mar 27, 2012
    12
    正则表达式
    013231
    013231
    OP
    Mar 27, 2012
    13
    @Muninn 不是不会, 而是想得到一种简单而优雅的方法.
    @chone 并非如此. 我本想用vim脚本来解决:
    G
    :s/\n//
    :wq
    然而, ":s/\n//"只对文件中间的'\n'有效, 对文件末尾的'\n'无效. "/\n"可以查找到文件末尾的'\n', ":s/\n//"却无法将其替换, 但也不提示"Pattern not found".
    @lackrp 谢谢, perl处理文本果然强大. 我熟悉的语言中没有一种可以如此简单的解决这个问题.
    lackrp
    lackrp
    Mar 27, 2012
    14
    @013231 我自己也不会,google到的 :)
    Muninn
    Muninn
    Mar 27, 2012
    15
    Perl那个的确够简洁
    vi是可以实现的,但是稍微麻烦,需要预先知道有多少行
    vi里J可以合并下一行 有多少行就用一个数字跟上J就可以了

    哎呀我晕了 vi不用那么麻烦 明明:%s/\n//g 就搞定了

    sed也是可以的 这个我以前用过
    sed ':a N;s/\n//g;ta'
    最简单的貌似是tr啊
    tr -d '\n'
    013231
    013231
    OP
    Mar 27, 2012
    16
    @Muninn 我的需求是: 如果文件的**最后一个**字符是'\n', 那么删除它. 不是删除文本中的全部'\n'.
    在vim中使用s/\n//是无法删除**最后一行**的'\n'的.
    sed中用N指令读取多行再替换'\n'同样无法解决**最后一行**的'\n'问题.
    anuxs
    anuxs
    Mar 27, 2012
    17
    有一批文件?
    写个脚本,把所有行串成一串字符就行了。跳出常规思维吧,别想着“去掉”,同志们。
    013231
    013231
    OP
    Mar 27, 2012
    18
    @lackrp 是**文件末尾**的'\n'. 您不妨个脚本试试, 可能没有您所想的那么简单. 这个帖子迄今为止还没有一个可用的脚本.
    @anuxs 又测试了一下, 那个perl脚本是有问题的. 它的作用是删除文件末尾的字符, 无论它是不是'\n'.
    Muninn
    Muninn
    Mar 27, 2012
    19
    抱歉 看错了.
    Muninn
    Muninn
    Mar 27, 2012
    20
    vi的话
    G
    k
    J
    x
    可以...

    不然想要判断出文件末尾的属性,我估计只能用python和perl了
    lululau
    lululau
    Mar 27, 2012
    21
    如果知道下一步怎么做的话,这样“gawk -v ORS='' 1 filename”做是最简单的
    这个方式“find dir -exec perl -pe -i 's#\n$##' {} \;” 是完整的命令
    david_lee_cn
    david_lee_cn
    Mar 27, 2012 via iPad
    22
    @lululau 注意看,是最后一行

    @anux的思路可行。

    Awk制定rfs='',读取所有行为一行,匹配$,if true, replace it, else print

    明天没解贴,我试下
    powerx1202
    powerx1202
    Mar 27, 2012
    23
    \n$ 匹配最后的换行
    powerx1202
    powerx1202
    Mar 27, 2012
    24
    没看清楚,sorry。。
    lululau
    lululau
    Mar 27, 2012
    25
    我就不信一行命令还搞不定了 :)

    Mac:
    find . -type f -exec bash -c 'tail -c 1 {} | wc -l | grep -q 1 && dd if=/dev/null of=h seek=$(($(stat -f%z {})-1)) bs=1 count=1' \;

    Linux:
    find . -type f -exec bash -c 'tail -c 1 {} | wc -l | grep -q 1 && dd if=/dev/null of=h seek=$(($(stat -c%s {})-1)) bs=1 count=1' \;
    lululau
    lululau
    Mar 27, 2012
    26
    判断最后一个字符是否是换行符,不知道有没有更好的方法。。。
    RustingSword
    RustingSword
    Mar 27, 2012
    27
    嗯,我想得也太简单了,昨天试了几次,效果都不怎么好……
    kojp
    kojp
    Mar 28, 2012
    28
    好吧,我用python小试一下~~~
    kojp
    kojp
    Mar 28, 2012
    29
    交作业~~~求拍砖

    f= open("./some.txt", "r")
    fstr=f.read()
    newstr=fstr[len(fstr)-1:]
    res=fstr[0:len(fstr)-1]+newstr.replace("\n", "nothing")#nothing can be ""
    f= open("./somenew.txt", "w")
    print>>f,res
    skywinger
    skywinger
    Mar 28, 2012
    30
    很简单的啊,在mac osx 或是linux的命令行环境下输入:
    dos2unix ...(文件名称)
    lackrp
    lackrp
    Mar 28, 2012
    31
    @013231 写错了,不应该是chop,应该是chomp,

    cat <filename> | perl -pe 'chomp if eof'
    erabbit
    erabbit
    Feb 13, 2020
    32
    javascript:
    a.replace(/\n$/,'')
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1303 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 22:22 · PVG 06:22 · LAX 14:22 · JFK 17:22
    ♥ Do have faith in what you're doing.