请教一下大家这个脚本怎么写 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
toyst
V2EX    Linux

请教一下大家这个脚本怎么写

  •  
  •   small class="gray">toyst 2021-05-25 17:22:54 +08:00 3445 次点击
    这是一个创建于 1603 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有个文本文件,N 行
    ```
    a1.txt
    a7.txt
    d9.log
    3j.log
    i6j.log
    .
    .
    .
    j34.ini
    l32.ini
    34j.ini
    ```
    现在想把包含 log 的行里面的数字去掉,类似这样:

    d9.log -> d.log
    d1.log -> d.log

    请假一下大佬们应该怎么写啊
    20 条回复    2021-05-26 17:56:42 +08:00
    NeezerGu
        1
    NeezerGu  
       2021-05-25 17:26:09 +08:00
    正则

    先判断.log 结尾的文件,取点前面的字符串,所有\d 替换成空
    Cowhitewhite
        2
    Cowhitewhite  
       2021-05-25 17:28:22 +08:00
    都叫 d.log 不会被覆盖吗
    toyst
        3
    toyst  
    OP
       2021-05-25 17:29:13 +08:00
    @Cowhitewhite 这个不是重点。。
    toyst
        4
    toyst  
    OP
       2021-05-25 17:29:56 +08:00
    @NeezerGu 查找替换我会,不会返回保留其他的行。。
    hendyzone
        5
    hendyzone  
       2021-05-25 17:42:59 +08:00
    `sed 's/[0-9]//g' 文件名`
    lamesbond
        6
    lamesbond  
       2021-05-25 17:57:57 +08:00
    找出 log 关键字所在行号,在行号里面循环,用 sed 删除单行里的数字
    zplee
        7
    zplee  
       2021-05-25 18:00:47 +08:00   1
    import re
    res =[]
    with open("test.txt", "r") as f:
    for line in f:
    res.append(list(line.strip('\n').split(',')))

    for i in res:
    r = re.search('log', i[0])
    if r:
    print(re.sub(r"\d",'',i[0]))
    else:
    print(i[0])

    # python
    遍历每行正则匹配,然后替换掉数字
    hasdream
        8
    hasdream  
       2021-05-25 18:05:42 +08:00
    sed -i '/.log/s/[0-9]\?//g' aafile
    leavic
        9
    leavic  
       2021-05-25 18:07:53 +08:00   2
    有这功夫我随便找个文本编辑器,把 0-9 全部替换为空都结了,还写脚本。
    ik
        10
    ik  
       2021-05-25 19:20:30 +08:00 via iPhone
    sed '/log/s/[0-9]//g' xxx
    iamzcr
        11
    iamzcr  
       2021-05-25 20:08:55 +08:00
    看到这问题,用 go 的 slice+map 写了下,不知道效率咋样,原理就是按照 ASCII 编码去取 0-9ASCII 编码的范围

    package main

    import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
    )

    func delSlice(slice []byte, dels []byte) []byte {
    dMap := make(map[byte]bool)
    for _, s := range dels {
    dMap[s] = true
    }
    for i := 0; i < len(slice); i++ {
    if _, ok := dMap[slice[i]]; ok {
    slice = append(slice[:i], slice[i+1:]...)
    i = i - 1
    }
    }
    return slice
    }
    func ReadLine(fileName string) {
    f, err := os.Open(fileName)
    if err != nil {
    panic(err)
    }
    buf := bufio.NewReader(f)
    for {
    line, err := buf.ReadString('\n')
    if err != nil {
    if err == io.EOF {
    break
    }
    }
    line = strings.TrimSpace(line)
    slice := make([]byte, 1)
    slice = []byte(line)
    outSlice := make([]byte, 1)
    for i := 0; i < len(slice)-1; i++ {
    if slice[i] > 47 && slice[i] <= 58 {
    outSlice = append(outSlice, slice[i])
    }
    }
    inSlice := delSlice(slice, outSlice)
    str := string(inSlice)
    fmt.Println(str)

    }
    }

    func main() {
    ReadLine("./test.txt")
    }
    iamzcr
        12
    iamzcr  
       2021-05-25 20:16:34 +08:00
    @iamzcr 还要判断下文件类型,忘了
    toyst
        13
    toyst  
    OP
       2021-05-25 22:03:37 +08:00
    @leavic 我只替换 log 结尾的行,你这样替换,其他行也替换了
    autoxbc
        14
    autoxbc  
       2021-05-25 23:30:58 +08:00
    const path = './test.txt';
    const text = Deno.readTextFileSync(path)
    .match(/^.+$/gm)
    .map( line => line.endsWith('.log') ? line.replace( /\d/g ,'') : line )
    .join('\n');
    Deno.writeTextFileSync( path , text );
    agnoe
        15
    agnoe  
       2021-05-26 00:36:33 +08:00
    SED 找到某一行,然后在这一行中进行替换的命令写法
    sed -i '/#PermitRootLogin/s/#//g' /etc/ssh/sshd_config
    xingheng
        16
    xingheng  
       2021-05-26 08:10:37 +08:00
    @leavic #9 楼主说是只替换.log 结尾的行,怎么“全部替换”?

    BTW,上面的 python 和 go 在 sed 面前就是个渣渣
    dier
        17
    dier  
       2021-05-26 09:41:12 +08:00
    sed -ie "/log/ {s/[0-9]//g}" filename.txt
    dier
        18
    dier  
       2021-05-26 09:42:47 +08:00
    上面那条会修改原文件,如果不想修改原文件,去掉 e 这个参数即可 sed -i "/log/ {s/[0-9]//g}" filename.txt
    dier
        19
    dier  
       2021-05-26 09:43:41 +08:00
    呃,写反了,去掉 i 这个参数 sed -e "/log/ {s/[0-9]//g}" filename.txt
    cwjwgg
        20
    cwjwgg  
       2021-05-26 17:56:42 +08:00
    @dier make 学习
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3153 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 12:40 PVG 20:40 LAX 05:40 JFK 08:40
    Do have faith in what you're doing.
    ubao 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