Text-Processing
使用 bash 從一行中分離數字、字元串
如何使用 bash 命令將字元串和數字從一行中分離出來。
範例:我有一個包含
string123anotherstr456thenanotherstr789
輸出應該是:
string 123 anotherstr 456 thenanotherstr 789
GNU**
grep
**或兼容的解決方案:s="string123anotherstr456thenanotherstr789" grep -Eo '[[:alpha:]]+|[0-9]+' <<<"$s"
[[:alpha:]]+|[0-9]+
- 正則表達式交替組,匹配字母字元或數字;兩者都將被視為輸出中的單獨條目輸出:
string 123 anotherstr 456 thenanotherstr 789
awk
輸入僅包含字母和數字
[[:alpha:]]+
在每個(字母序列)和每個(數字序列)之後添加一個換行符[[:digit:]]+
:awk '{ gsub(/([[:alpha:]]+|[[:digit:]]+)/,"&\n",$0) ; printf $0 }' filename
(這
&
是awk
匹配序列的簡寫。)輸入包含其他字元(例如,標點符號)
和以前一樣,但現在還要處理
[^[:alnum:]]+
(非字母、非數字)字元的子字元串:awk '{ gsub(/([[:alpha:]]+|[[:digit:]]+|[^[:alnum:]]+)/,"&\n",$0) ; printf $0 }' filename
負數和小數
-
將(連字元)和.
(句點)視為數字:awk '{ gsub(/([[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+)/,"&\n",$0) ; printf $0 }' filename
這些字元必須同時出現在
[[:digit:].-]+
and[^[:alnum:].-]+
表達式中。此外,要解釋為文字連字元,-
必須是每個表達式的最後一個右方括號之前的最後一個字元*;否則,它表示一個字元範圍*。例子:
[test]$ cat file.txt string123another!!str456.001thenanotherstr-789 [test]$ awk '{ gsub(/([[:alpha:]]+|[[:digit:].-]+|[^[:alnum:].-]+)/,"&\n",$0) ; printf $0 }' file.txt string 123 another !! str 456.001 thenanotherstr -789
給讀者的練習
如果輸入文件需要它,您可以將
awk
命令修改為:
- 確保僅當它出現在數字序列的開頭
-
時才算作數字的一部分。- 允許以科學計數法表示的數字。