删除第一个数字

时间:2017-07-10 20:41:59

标签: shell

晚上好,

我有文本文件,我想只保留每行中的第一个数字或换句话说:删除除第一个数字以外的所有数字。为了方便起见,我有这个文件

$ cat file
one1
2two3
45end6

我期待这个输出:

one1
2two
4end

有人能指出我正确的方向。

4 个答案:

答案 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 matchexpr substr的解决方案,但sed解决方案效率更高,因为您将在每个{{{}}上生成单独的子shell {1}}致电。 (但知道替代方案很好......)