删除所有不是 4 个字符的数字

Dis*_*ame 4 text-processing

我需要删除所有不是 4 个字符的数字,例如9838, 6738,13371889

我认为这个命令会起作用:

sed 's/....[^0-9]//g'
Run Code Online (Sandbox Code Playgroud)

.表示正则表达式中的任何字符,并且不[^0-9]删除任何数字。

这是一个示例输入:

9228 Hello 8473 World War 1 1914-1918 Hello 8391 World War 2 1939-1945
Run Code Online (Sandbox Code Playgroud)

将是:

9228 8473 1914 1918 8391 1939 1945
Run Code Online (Sandbox Code Playgroud)

αғs*_*нιη 8

我可以用grep命令回答:

输入文件:

9228 Hello 8473 World War 1 1914-1918 Hello 8391 World War 2 1939-1945
Run Code Online (Sandbox Code Playgroud)

命令:

grep -Eo '\<[0-9]{4}\>' file |tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

返回长度为 4 的任意数字。

-E切换到扩展正则表达式 -o只打印匹配的部分

输出:

9228 8473 1914 1918 8391 1939 1945
Run Code Online (Sandbox Code Playgroud)

更新答案:

输入文件:

9228 Hello 8473 World War 1 1914-1918 Hello 8391 World War 2 1939-1945

foo1234bar
a1111
12345
0x2222ff
1.3333
2.54321
Run Code Online (Sandbox Code Playgroud)

命令

grep -oP '(?<![0-9])[0-9]{4}(?![0-9])' file | tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

grep 负向后视/前瞻:

(?<![0-9])[0-9]{4}(negative lookbehind):将数字匹配到前面没有数字的 length=4 [0-9]
[0-9]{4}(?![0-9])(负前瞻):将数字匹配到 length=4,后面没有数字。

输出:

9228 8473 1914 1918 8391 1939 1945 1234 1111 2222 3333
Run Code Online (Sandbox Code Playgroud)

  • @JohnWHSmith:我试过了,它给了我一个没有尖括号的五位数字符串的前四位数。 (3认同)

gar*_*Red 5

您可以使用perl.

perl -nle'print join " ", /(?<![0-9])[0-9]{4}(?![0-9])/g'
Run Code Online (Sandbox Code Playgroud)

这也适用于多行输入,因此如果您有:

9228 Hello 8473 World War 1 1914-1918
Hello 8391 World War 2 1939-1945
Run Code Online (Sandbox Code Playgroud)

你会得到以下返回:

9228 8473 1914 1918
8391 1939 1945
Run Code Online (Sandbox Code Playgroud)

-0777如果您希望数字在同一行上,请添加。)