Shell-Script
沒有 awk 或 sed 的字元串操作
感謝您對此問題的任何幫助我有一個格式如下的文本文件
我們可以安全地假設名稱總是三個字元長,職業 7 個字元和薪水 5 個字元。變數來自使用者輸入,而不是作為參數。
BobJanitor20000 TedBuilder30000 NedFighter25000 KitTeacher40000
我要求使用者輸入姓名和另一個輸入是否顯示職業或薪水
如果使用者輸入“Ted”並選擇薪水,輸出應該是
Ted 30000
該程序還必須考慮部分名稱匹配,“ed”和薪水應該輸出
Ted 30000 Ned 25000
我知道
cut
並且grep
可以給我相關的線路,但是我如何創建我想要的輸出?
這是一個適用於名稱搜尋的腳本。我使用的是here 文件(又名 heredoc)而不是外部文件來將列表傳遞到 while 循環,以便它全部包含在此文件中以便於閱讀。您可以根據需要擴展它。
閱讀
man bash
有關內置命令的資訊,(並在手冊中搜尋我用粗體表示的內容)我正在使用,
- 子字元串擴展以獲取行的部分
- 正則表達式匹配找到匹配 =~
- [[ …]]根據內部表達式返回條件值(0 或 1)
繼承人的腳本:
read -p "Input Name: " SearchName while read line do Name=${line:0:3} Job=${line:3:7} Salary=${line:10:5} [[ $Name =~ $SearchName ]] && echo $Name $Salary done << "end--" BobJanitor20000 TedBuilder30000 NedFighter25000 end-- user@machine:~/tmp$ bash manipvar.sh Input Name: ed Ted 30000 Ned 25000 user@machine:~/tmp$
$ grep -F ed file|fold -w 5|fold -w 3|grep -E '^[[:upper:]]..|^[0-9]'|paste -sd ' \0\n' - Ted 30000 Ned 25000
或者:
$ cut -c 1-3,11- file | grep -F ed | fold -w 3 | paste -sd ' \0\n' - Ted 30000 Ned 25000
或者(假設 GNU
grep
):$ grep -oE '^.{3}|.{5}$' file | paste -sd ' \n' - | grep -F ed Ted 30000 Ned 25000
您還可以執行以下操作(假設 shell 支持程序替換):
separate() { fold -w 1 -- "$@" | paste -sd '\0\0 \0\0\0\0\0\0 \0\0\0\0\n' - | sort -k 1,1 } join <(separate file | cut -d ' ' -f 1 | grep -F ed ) <(separate file) | cut -d ' ' -f 1,3