[英]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.