bash shell脚本可以用less打开一个文本文件,然后从脚本执行更少的命令吗?

时间:2014-08-31 05:23:51

标签: bash shell

我想编写一个shell脚本,可以少打开一个文本文件。

less filename.txt 

然后我希望脚本使用/'搜索字符串'在文件中向前搜索,或者使用?'搜索字符串'进行搜索。我还希望脚本将结果读入变量。

我可以得到一个脚本来少打开文件,但是如何在打开文件后让bash调用一系列较少的命令?可以这样做吗?

3 个答案:

答案 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的任何其他行上,打印出变量bookchapter和整个当前行。哦,顺便说一句,把我用冒号打印出来的东西分开。并在名为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只是为您自动执行流程的搜索部分。