Bash:如何在给定位置的任意行中打印具有特定给定单词的文件



是否可以编写一个包含两个参数的脚本:word表示要在目录文件中查找的任何单词,n表示该单词必须在该文件中任何一行的位置,最后只打印任何一行中该位置具有该单词的文件?

到目前为止,我的代码是:

word=$1
for files in .
do
grep -rl "$word" 
done

然而,这只打印包含该单词的文件,我不知道如何实现其余部分

您的循环似乎有点奇怪,您希望循环通过所有文件,而不是通过您提供的一组内容(这是一个只有一个条目.的集合(。一点用处都没有。

所以,CCD_ 2将更有意义。然后,使用${file}变量!你甚至没有在for循环中使用它做任何事情!这也毫无意义。

例如,你可以

  1. 使用read从文件中获取行(关于如何使用bash从文件中读取行的数千个示例(
  2. 使用cut选择位置
  3. 使用[[/]]测试该位置的字符串,如果成功
  4. 打印文件名,然后跳到下一个文件

或者,学习一些正则表达式。不知道你有哪个版本的grep,但是"从该行的开头找到具有N个表示的事物的方案";除了分隔符之外的任何内容的任何重复+一个单词分隔符,后跟单词I’t’t;并不难。

类似于,寻找";芥末";第五个单词:

words_before=4
word="mustard"
# idea is to get the sed expression '/^([^ ]+ ){words_before}word/!{qerror_code}'
sedtemplate_start='/^([^ ]+ )'
sedtemplate_end='/!{q100}'
sedtemplate="${sedtemplate_start}\{${words_before}\}${word}${sedtemplate_end}"
#.... open all files, go through all lines
( echo "${this_line}" | sed -n "${sedtemplate}" ) && echo "${file}"

如果我理解你试图正确地做什么,那么正确的方法是(未经测试(:

#!/usr/bin/env bash
awk -v word="$1" -v pos="$2" -v ORS='' '$pos == word { print FILENAME; nextfile }' * |
xargs -0 cat

假设您的awk支持nextfile和打印(例如GNU awk(。

最新更新