我需要删除所有不是 4 个字符的数字,例如9838, 6738,1337或1889。
我认为这个命令会起作用:
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)
我可以用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)
您可以使用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如果您希望数字在同一行上,请添加。)