Большое спасибо. Я использовал предоставленные вами решения для создания своих нужд. :)
awk '/#define.*\/$/{cnt[$2]++}END{for(i in cnt)print i}' > macro_names
#!/usr/local/bin/bash -x
TotalCount=0
CurrFileTotalCount=0
#takes One $macro after other from macro_names.txt file
for macro in $(cat macro_names);
do
#Takes $files from the current path in a recursive manner
#<$(find . -type f -name "*.c" -o -name "*.h")
for files in $(find . -type f -name "*.c" -o -name "*.h")
do
#Counts the number of times $macro is present in $files
CurrFileTotalCount=$(grep -c $macro "${files}");
#Adds the Current file count to $TotalCount
TotalCount=$(($TotalCount+$CurrFileTotalCount));
#print the $CurrFileTotalCount and $TotalCount PROPERLY
done
#Expected to print how many times that $macro is present in the files -- BUT PRINTS $TotalCount AS 0
echo $macro appears_3 TotalCount $TotalCount
TotalCount=0;
done
В регулярных выражениях .
соответствует любому символу, а *
- это квалификатор, который вы добавляете к чему-то, чтобы сказать 0 или более из этого чего-то . Итак, . *
- любое число (0 или более) из символов .
Итак, как сказал Анджело, вы можете сделать:
awk '/^To.*day$/'
Начало записи ( ^
), за которым следует До
, за которым следует любое количество символов (. *
), за которым следует день
, за которым следует конец записи ( $
).
В качестве альтернативы вы можете написать:
awk '/^To/ && /day$/'
Это также будет соответствовать записям, в которых то, что находится между до
и день
, не содержит символов. Другое отличие будет в случаях, например, когда вы замените на
/ день
на abc
/ cde
, который будет соответствовать abcde
.
awk '$0 ~ /^To.*day$/ {print}' file
или просто
awk '/^To.*day$/ {print}' file
или даже (поскольку действие по умолчанию - распечатать запись):
awk '/^To.*day$/' file