晚上好,
我有文本文件,我想只保留每行中的第一个数字或换句话说:删除除第一个数字以外的所有数字。为了方便起见,我有这个文件
$ cat file
one1
2two3
45end6
我期待这个输出:
one1
2two
4end
有人能指出我正确的方向。
答案 0 :(得分:3)
最简单的方法是告诉sed -i ':a;s/[0-9]//2;ta' file
删除第二次出现的数字。多次通过,保证除第一次出现之外的所有数字都将被删除。
:a
a
定义了标记为s/[0-9]//2
的函数。
ta
删除第二次出现的数字。
:
分支到功能a
标记为one1
2two
4end
。
示例输出:
{{1}}
答案 1 :(得分:0)
我认为这完全是错误的方向,但你可以这样做:
const axios = require('axios')
const cheerio = require('cheerio')
const url = 'https://github.com/archae0pteryx'
function getCommits(url) {
return new Promise((resolve, reject) => {
axios.get(url).then(res => {
const load = cheerio.load(res.data)
const parsed = load('div.js-contribution-graph > h2').text()
const reg = /\d+/g
const x = parsed.match(reg)
resolve(x)
}).catch(err => reject(err))
})
}
getCommits(url)
.then(x => console.log(x))
.catch(err => console.error(err))
答案 2 :(得分:0)
我认为您的文件中没有\r
(或先删除该字符),因此您可以使用该字符标记数字。
sed -r 's/([0-9])/\r\1/g; s/\r//; s/\r[0-9]//' inputfile
首先标记所有数字,然后删除第一个数字之前的标记,最后删除所有仍有标记的数字。
编辑:用s/\r([0-9])/\1/;
s/\r//;
答案 3 :(得分:0)
你实际上可以在POSIX shell中使用expr
做你需要的,例如。
while read -r line; do
len=$(expr match "$line" [0-9][0-9]*[A-Za-z]*)
[ "$len" -gt '0' ] && expr substr "$line" 1 $len ||
printf "%s\n" "$line"
done < file
使用file
中的数据,只需将上述内容剪切并粘贴到命令行中,例如
$ while read -r line; do
> len=$(expr match "$line" [0-9][0-9]*[A-Za-z]*)
> [ "$len" -gt '0' ] && expr substr "$line" 1 $len ||
> printf "%s\n" "$line"
> done < file
one1
2two
45end
注意:虽然这是使用expr match
和expr substr
的解决方案,但sed
解决方案效率更高,因为您将在每个{{{}}上生成单独的子shell {1}}致电。 (但知道替代方案很好......)