[英]Can a bash shell script open a text file with less and then execute less commands from the script?
我想編寫一個shell腳本,可以少打開一個文本文件。
less filename.txt
然后,我希望腳本使用/'搜索字符串'搜索文件或使用搜索字符串'搜索字符串'。 我還希望腳本將結果讀入變量。
我可以得到一個腳本來少打開文件,但是如何在打開文件后讓bash調用一系列較少的命令? 可以這樣做嗎?
如果您向我們展示了文件的結構,我懷疑您可以使用awk
更輕松地完成此操作。 您將從頂部開始,每次遇到新書時,都會記下書名。 每次遇到章節時,都會注意章節名稱。 然后每當你遇到你想要的單詞時,你就會打印出你看過的最后一本書,章節等。
想象你的文件看起來像這樣:
Book:Book 1
Chapter:Chapter 1
Word word word word
Word word word
Chapter:Chapter 2
Word word interesting word
然后,找到'有趣'
awk -v x="interesting" -F':' '
/^Book/ {book=$2}
/^Chapter/ {chapter=$2}
$0 ~ x {print book,chapter,$0} ' OFS=":" YourFile
未經測試 - 因為我在我的iPad上 - 但可能非常接近:-)
那說...將變量x
設置為interesting
的單詞。 在讀取行時,使用冒號分隔字段,因此第一個冒號的所有內容都是字段1( $1
),第一個和第二個冒號之間的所有內容都是字段2( $2
)。 如果您看到以Book
開頭的行,請記住變量book
的第二個字段。 如果您看到以Chapter
開頭的行,請記住變量chapter
的第二個字段。 在任何其他行上,整行( $0
)包含interesting
的單詞,打印出變量book
, chapter
和整個當前行。 哦,順便說一句,把我用冒號打印出來的東西分開。 並在名為YourFile
的文件上執行此YourFile
。
您可以通過在每次遇到新行時將其增加並在每次遇到新章節時將其重置為零來自己跟蹤詩歌編號...
awk -v x="interesting" -F':' '
{verse++}
/^Book/ {book=$2}
/^Chapter/ {chapter=$2;verse=0}
$0 ~ x {print book,chapter,verse,$0} ' OFS=":" YourFile
輸出:
Book 1:Chapter 2:1:Word word interesting word
您可以使用
less -pbazorka filename.txt
-ppattern或--pattern = pattern
命令行上的-p選項等同於指定+ / pattern; 也就是說,它告訴較少從文件中第一次出現模式開始。
- http://linux.die.net/man/1/less
你不能在腳本中less
辦事。 一旦你將控制權交給它,就沒有任何語言可以控制得更少。 為了做你想做的事,最簡單的方法是使用grep
。 例如,您可以使用以下命令將匹配的文本讀入bash中的數組:
declare -a results
IFS=$'\n' # set IFS to only break on newline
results=( $(grep $srchterm $filename) ) # read results into array
<parse as necessary>
第二種選擇是while read -r line; do... done <<< $(grep $srchterm $filename)
while read -r line; do... done <<< $(grep $srchterm $filename)
基本上做同樣的事情。
在任何一種情況下,這都允許您將所需的文本行轉換為腳本中的變量。 然后,您可以使用模式匹配和子字符串提取進一步將行解析為其他變量。 如果您不使用grep
,那么您可以選擇逐行讀取文件並手動搜索感興趣的文本。 grep
只是為您自動執行流程的搜索部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.