我正在制作的命令希望第一個輸入是一個檔案,并使用 grep 和 sed 搜索特定模式在檔案中出現的次數。前任:
$ cat file1
oneonetwotwotwothreefourfive
預期輸出:
$ ./command file1 one two three
one 2
two 3
three 1
問題是該檔案沒有任何行,只是一長串字母。我正在嘗試使用 sed 用“FIND”替換我正在尋找的模式并將串列移動到下一行,這一直持續到檔案結束。然后,使用 $grep FIND 獲取包含 FIND 的行。最后,使用 wc -l 查找多行。但是,我找不到將串列移動到下一行的選項
前任:
$cat file1
oneonetwosixone
預期輸出:
FIND
FIND
twosixFIND
我遇到的另一個問題是如何使用其余的輸入,不包括檔案。
失敗的嘗試:
file=$1
for PATTERN in 2 3 4 5 ... N
do
variable=$(sed 's/$PATTERN/find/g' $file | grep FIND $file | wc -l)
echo $PATTERN $variable
exit
另一個失敗的嘗試:
file=$1
PATTERN=$($2,$3 ... $N)
for PATTERN in $*
do variable=$(sed 's/$PATTERN/FIND/g' $file | grep FIND $file | wc-1)
echo $PATTERN $variable
exit
任何建議和幫助將不勝感激。先感謝您。
uj5u.com熱心網友回復:
這可能對您有用(GNU bash、sed 和 uniq):
f(){ local file=$1;
shift;
local args="$@";
sed -E 's/'${args// /|}'/\n&\n/g
s/(\n\S )\n\S /\1/g
s/\n /\n/g
s/.(.*)/echo "\1"|uniq -c/e
s/ *(\S ) (\S )/\2 \1/mg' $file; }
將引數分成檔案和剩余引數。
在 sed 替換命令中將引數作為交替應用,該命令將單詞分成由兩邊換行分隔的行。
洗掉不需要的單詞和不需要的換行符。
使用帶有 -c 選項的 uniq 命令評估 sed 替換中的制造檔案。
重新排列輸出并列印結果。
uj5u.com熱心網友回復:
問題是檔案沒有任何行
偉大的!所以問題簡化為放置換行符。
func() {
file=$1
shift
rgx=$(printf "%s\\|" "$@" | sed 's@\\|$@@');
# put the newline between words
sed 's/\('"$rgx"'\)/&\n/g' "$file" |
# it's just standard here
sort | uniq -c |
# filter only input - i.e. exclude fourfive
grep -xf <(printf " *[0-9]\ %s\n" "$@")
};
func <(echo oneonetwotwotwothreefourfive) one two three
輸出:
2 one
1 three
3 two
uj5u.com熱心網友回復:
使用 GNU grep 的非便攜式解決方案:
file=$1
shift
for pattern in "$@"; do
echo "$pattern" $(grep -o -e "$pattern" <"$file" | wc -l)
done
如果您想使用sed并且您的“模式”實際上是固定字串(其中不包含對 具有特殊含義的字符sed),您可以執行以下操作:
file=$1
shift
for pattern in "$@"; do
echo "$pattern" $(
sed "s/$pattern/\n&\n/g" "$file" |\
grep -e "$pattern" | wc -l
)
done
您的代碼有幾個問題:
- 您應該參考可能發生分詞的變數的使用
- 不要使用 ALLCAPS 變數名 - 它們保留供 shell 使用
- 如果將字串放在單引號中,則不會發生變數擴展
- 如果你給
grep一個檔案,它不會讀取標準輸入 - 你的
for回圈沒有終止done
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/314532.html
