Text-Processing

使用 bash 從一行中分離數字、字元串

  • January 9, 2018

如何使用 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命令修改為:

  • 確保僅當它出現在數字序列的開頭-時才算作數字的一部分。
  • 允許以科學計數法表示的數字。

引用自:https://unix.stackexchange.com/questions/415588