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

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

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

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

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

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

    @anux的思路可行。

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

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

    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
        26
    lululau  
       Mar 27, 2012
    判断最后一个字符是否是换行符,不知道有没有更好的方法。。。
    RustingSword
        27
    RustingSword  
       Mar 27, 2012
    嗯,我想得也太简单了,昨天试了几次,效果都不怎么好……
    kojp
        28
    kojp  
       Mar 28, 2012
    好吧,我用python小试一下~~~
    kojp
        29
    kojp  
       Mar 28, 2012
    交作业~~~求拍砖

    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
        30
    skywinger  
       Mar 28, 2012
    很简单的啊,在mac osx 或是linux的命令行环境下输入:
    dos2unix ...(文件名称)
    lackrp
        31
    lackrp  
       Mar 28, 2012
    @013231 写错了,不应该是chop,应该是chomp,

    cat <filename> | perl -pe 'chomp if eof'
    erabbit
        32
    erabbit  
       Feb 13, 2020
    Javascript:
    a.replace(/\n$/,'')
    About     Help     Advertise     Blog     API     FAQ     Solana     2909 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 57ms UTC 07:30 PVG 15:30 LAX 00:30 JFK 03:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86