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

2021-05-25 17:22:54 +08:00
 toyst
有个文本文件,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

请假一下大佬们应该怎么写啊
3015 次点击
所在节点    Linux
20 条回复
NeezerGu
2021-05-25 17:26:09 +08:00
正则

先判断.log 结尾的文件,取点前面的字符串,所有\d 替换成空
Cowhitewhite
2021-05-25 17:28:22 +08:00
都叫 d.log 不会被覆盖吗
toyst
2021-05-25 17:29:13 +08:00
@Cowhitewhite 这个不是重点。。
toyst
2021-05-25 17:29:56 +08:00
@NeezerGu 查找替换我会,不会返回保留其他的行。。
hendyzone
2021-05-25 17:42:59 +08:00
`sed 's/[0-9]//g' 文件名`
lamesbond
2021-05-25 17:57:57 +08:00
找出 log 关键字所在行号,在行号里面循环,用 sed 删除单行里的数字
zplee
2021-05-25 18:00:47 +08:00
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
2021-05-25 18:05:42 +08:00
sed -i '/.log/s/[0-9]\?//g' aafile
leavic
2021-05-25 18:07:53 +08:00
有这功夫我随便找个文本编辑器,把 0-9 全部替换为空都结了,还写脚本。
ik
2021-05-25 19:20:30 +08:00
sed '/log/s/[0-9]//g' xxx
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
2021-05-25 20:16:34 +08:00
@iamzcr 还要判断下文件类型,忘了
toyst
2021-05-25 22:03:37 +08:00
@leavic 我只替换 log 结尾的行,你这样替换,其他行也替换了
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
2021-05-26 00:36:33 +08:00
SED 找到某一行,然后在这一行中进行替换的命令写法
sed -i '/#PermitRootLogin/s/#//g' /etc/ssh/sshd_config
xingheng
2021-05-26 08:10:37 +08:00
@leavic #9 楼主说是只替换.log 结尾的行,怎么“全部替换”?

BTW,上面的 python 和 go 在 sed 面前就是个渣渣
dier
2021-05-26 09:41:12 +08:00
sed -ie "/log/ {s/[0-9]//g}" filename.txt
dier
2021-05-26 09:42:47 +08:00
上面那条会修改原文件,如果不想修改原文件,去掉 e 这个参数即可 sed -i "/log/ {s/[0-9]//g}" filename.txt
dier
2021-05-26 09:43:41 +08:00
呃,写反了,去掉 i 这个参数 sed -e "/log/ {s/[0-9]//g}" filename.txt
cwjwgg
2021-05-26 17:56:42 +08:00
@dier make 学习

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/779137

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX