是否可以撰寫一個帶有 2 個引數的腳本:word 表示要在目錄檔案中搜索的任何單詞,n 表示該單詞必須在該檔案的任何行中的位置,最后只列印在任何行的該位置具有該單詞的檔案?
到目前為止,我的代碼是:
word=$1
for files in .
do
grep -rl "$word"
done
但是,這只列印包含該單詞的檔案,我不確定如何實作其余部分。
uj5u.com熱心網友回復:
你的回圈看起來有點奇怪,你想回圈遍歷所有檔案,而不是通過你提供的一組東西(這是一個帶有單個條目的集合.)。一點用都沒有。
所以,
for file in *會更有意義。然后,使用該${file}變數!你甚至沒有在你的 for 回圈中對它做任何事情!這也沒有任何意義。
例如,你可以
- 用于
read從檔案中獲取行(關于如何使用 bash 從檔案中讀取行的數千個示例) - 用于
cut選擇位置 - 使用
[[/]]測驗該位置的字串,如果成功 - 列印檔案名并跳到下一個檔案。
或者,學習一些正則運算式。不知道grep你有哪個版本,但是“從行的開頭,找到有 N 個重復的東西,這個方案”除了分隔符之外的任何重復 一個單詞分隔符,然后是我正在尋找的單詞”不難。
類似于,在第五個字中尋找“芥末”:
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}"
uj5u.com熱心網友回復:
如果我了解您要正確執行的操作,那么正確的方法是(未經測驗):
#!/usr/bin/env bash
awk -v word="$1" -v pos="$2" -v ORS='\0' '$pos == word { print FILENAME; nextfile }' * |
xargs -0 cat
假設您的 awk 支持nextfile和列印\0(例如 GNU awk)。
uj5u.com熱心網友回復:
假設您要在給定位置搜索文字單詞,以下腳本會生成相應的 ERE 正則運算式并將其與 一起使用grep:
#!/bin/sh
grep -Erl "^ *([^ ] ){$(($2 - 1))}$(sed 's/[][\.|$(){}? *^]/\\&/g' <<< "$1")" .
ERE 正則運算式有 3 個部分:
^ *匹配行的開頭,后跟任意數量的space字符([^ ] ){N}匹配N乘以序列:一個單詞后跟一個或多個space字符。sed 's/[][\.|$(){}? *^]/\\&/g'轉義您的文字文字(此 ERE 轉義命令取自此處)
你應該學習一些關于正則運算式的知識 ;-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/386447.html
上一篇:為什么sed不替換空字符\x0?
