V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
013231
V2EX  ›  问与答

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

  •  
  •   013231 · 2012-03-27 00:01:24 +08:00 · 14301 次点击
    这是一个创建于 4625 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在有一批文件, 需要检测文件末尾, 如果末尾是换行符('\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   ·   实用小工具   ·   944 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:59 · PVG 04:59 · LAX 12:59 · JFK 15:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.