V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
toyst
V2EX  ›  Linux

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

  •  
  •   toyst · 2021-05-25 17:22:54 +08:00 · 2985 次点击
    这是一个创建于 1283 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有个文本文件,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   ·   实用小工具   ·   1076 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:59 · PVG 03:59 · LAX 11:59 · JFK 14:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.