技术解析

请教一下大家这个脚本怎么写
0
2021-06-12 00:01:28
idczone
有个文本文件,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

请假一下大佬们应该怎么写啊
正则
先判断.log 结尾的文件,取点前面的字符串,所有\d 替换成空

都叫 d.log 不会被覆盖吗

这个不是重点。。

查找替换我会,不会返回保留其他的行。。

`sed 's/[0-9]//g' 文件名`

找出 log 关键字所在行号,在行号里面循环,用 sed 删除单行里的数字

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
遍历每行正则匹配,然后替换掉数字

sed -i '/.log/s/[0-9]\?//g' aafile

有这功夫我随便找个文本编辑器,把 0-9 全部替换为空都结了,还写脚本。

sed '/log/s/[0-9]//g' xxx

看到这问题,用 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")
}

还要判断下文件类型,忘了

我只替换 log 结尾的行,你这样替换,其他行也替换了

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 );

SED 找到某一行,然后在这一行中进行替换的命令写法
sed -i '//etc/ssh/sshd_config

楼主说是只替换.log 结尾的行,怎么“全部替换”?
BTW,上面的 python 和 go 在 sed 面前就是个渣渣

sed -ie "/log/ {s/[0-9]//g}" filename.txt

上面那条会修改原文件,如果不想修改原文件,去掉 e 这个参数即可 sed -i "/log/ {s/[0-9]//g}" filename.txt

呃,写反了,去掉 i 这个参数 sed -e "/log/ {s/[0-9]//g}" filename.txt

make 学习

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服