Shell-Script

沒有 awk 或 sed 的字元串操作

  • April 23, 2020

感謝您對此問題的任何幫助我有一個格式如下的文本文件

我們可以安全地假設名稱總是三個字元長,職業 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

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