我想编写一个shell脚本,可以少打开一个文本文件。
less filename.txt
然后我希望脚本使用/'搜索字符串'在文件中向前搜索,或者使用?'搜索字符串'进行搜索。我还希望脚本将结果读入变量。
我可以得到一个脚本来少打开文件,但是如何在打开文件后让bash调用一系列较少的命令?可以这样做吗?
答案 0 :(得分:2)
如果您向我们展示了文件的结构,我怀疑您可以使用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
的文件上执行此操作。
你可以通过每次遇到一个新行时递增它来自己跟踪这个诗歌编号,并在每次遇到新章节时将其重置为零...
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
答案 1 :(得分:1)
您可以使用
less -pbazorka filename.txt
-ppattern或--pattern = pattern
命令行上的-p选项等同于指定+ / pattern;也就是说,它告诉较少从文件中第一次出现模式开始 - http://linux.die.net/man/1/less
答案 2 :(得分:0)
您无法在脚本中使用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)
基本上做同样的事情。
在任何一种情况下,这都允许您将所需的文本行转换为脚本中的变量。然后,您可以使用模式匹配和子字符串提取进一步将行解析为其他变量。如果您不使用grep
,那么您可以选择逐行读取文件并手动搜索感兴趣的文本。 grep
只是为您自动执行流程的搜索部分。