去掉文件末尾的换行符, 怎么做最方便? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
013231
V2EX    问与答

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

  •  
  •   013231 2012-03-27 00:01:24 +08:00 14934 次点击
    这是一个创建于 4993 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有一批文件, 需要检测文件末尾, 如果末尾是换行符('\n'), 就把那个换行符删除.
    为了实现这个目的, 怎样做最方便?
    32 条回复    2020-02-13 21:53:26 +08:00
    Muninn
        1
    Muninn  
       2012-03-27 00:05:49 +08:00
    ue之类的编辑器替换
    甚至word都能替换
    RustingSword
        2
    RustingSword  
       2012-03-27 00:09:43 +08:00
    sed
    gujiaxi
        3
    gujiaxi  
       2012-03-27 00:21:44 +08:00
    sed
    013231
        4
    013231  
    OP
       2012-03-27 00:32:38 +08:00
    @gujiaxi @RustingSword sed应该怎么做? 就算没有换行符, sed输出一行时也会加上一个换行符. 如何禁止sed自动添加换行符?
    013231
        5
    013231  
    OP
       2012-03-27 00:35:57 +08:00
    @yuhuofeihe @Muninn 我需要一个自动化的解决方案.
    66450146
        6
    66450146  
       2012-03-27 00:39:34 +08:00
    013231
        7
    013231  
    OP
       2012-03-27 00:52:28 +08:00
    @66450146 此命令对文件末尾的'\n'无效.
    Muninn
        8
    Muninn  
       2012-03-27 01:24:37 +08:00
    汗...我还没见过到研究sed层次的人不会做这个...
    chone
        9
    chone  
       2012-03-27 02:02:07 +08:00
    不用sed其他任意一种可以用正则的方式总行吧。
    yuhuofeihe
        10
    yuhuofeihe  
       2012-03-27 08:31:30 +08:00
    首选word~
    lackrp
        11
    lackrp  
       2012-03-27 09:36:28 +08:00
    cat <filename> | perl -pe 'chop if eof'
    why
        12
    why  
       2012-03-27 10:19:27 +08:00
    正则表达式
    013231
        13
    013231  
    OP
       2012-03-27 18:46:35 +08:00
    @Muninn 不是不会, 而是想得到一种简单而优雅的方法.
    @chone 并非如此. 我本想用vim脚本来解决:
    G
    :s/\n//
    :wq
    然而, ":s/\n//"只对文件中间的'\n'有效, 对文件末尾的'\n'无效. "/\n"可以查找到文件末尾的'\n', ":s/\n//"却无法将其替换, 但也不提示"Pattern not found".
    @lackrp 谢谢, perl处理文本果然强大. 我熟悉的语言中没有一种可以如此简单的解决这个问题.
    lackrp
        14
    lackrp  
       2012-03-27 19:36:04 +08:00
    @013231 我自己也不会,google到的 :)
    Muninn
        15
    Muninn  
       2012-03-27 20:55:19 +08:00
    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
       2012-03-27 21:20:35 +08:00
    @Muninn 我的需求是: 如果文件的**最后一个**字符是'\n', 那么删除它. 不是删除文本中的全部'\n'.
    在vim中使用s/\n//是无法删除**最后一行**的'\n'的.
    sed中用N指令读取多行再替换'\n'同样无法解决**最后一行**的'\n'问题.
    anuxs
        17
    anuxs  
       2012-03-27 21:22:36 +08:00
    有一批文件?
    写个脚本,把所有行串成一串字符就行了。跳出常规思维吧,别想着“去掉”,同志们。
    013231
        18
    013231  
    OP
       2012-03-27 21:46:36 +08:00
    @lackrp 是**文件末尾**的'\n'. 您不妨个脚本试试, 可能没有您所想的那么简单. 这个帖子迄今为止还没有一个可用的脚本.
    @anuxs 又测试了一下, 那个perl脚本是有问题的. 它的作用是删除文件末尾的字符, 无论它是不是'\n'.
    Muninn
        19
    Muninn  
       2012-03-27 21:49:13 +08:00
    抱歉 看错了.
    Muninn
        20
    Muninn  
       2012-03-27 22:03:57 +08:00
    vi的话
    G
    k
    J
    x
    可以...

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

    @anux的思路可行。

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

    明天没解贴,我试下
    powerx1202
        23
    powerx1202  
       2012-03-27 23:19:42 +08:00
    \n$ 匹配最后的换行
    powerx1202
        24
    powerx1202  
       2012-03-27 23:31:11 +08:00
    没看清楚,sorry。。
    lululau
        25
    lululau  
       2012-03-27 23:33:14 +08:00
    我就不信一行命令还搞不定了 :)

    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  
       2012-03-27 23:38:21 +08:00
    判断最后一个字符是否是换行符,不知道有没有更好的方法。。。
    RustingSword
        27
    RustingSword  
       2012-03-27 23:57:16 +08:00
    嗯,我想得也太简单了,昨天试了几次,效果都不怎么好……
    kojp
        28
    kojp  
       2012-03-28 10:40:28 +08:00
    好吧,我用python小试一下~~~
    kojp
        29
    kojp  
       2012-03-28 11:07:54 +08:00
    交作业~~~求拍砖

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

    cat <filename> | perl -pe 'chomp if eof'
    erabbit
        32
    erabbit  
       2020-02-13 21:53:26 +08:00
    Javascript:
    a.replace(/\n$/,'')
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1068 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 23:21 PVG 07:21 LAX 15:21 JFK 18:21
    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