2017-01-31 2 views
0

В приведенном ниже сценарии я хочу добавить имя файла в качестве префикса для каждой выходной строки, сгенерированной grep. я не знаю, почему это не заменяет имя файла с $ файла, я получаю $ файл как prefix.can кто-нибудь поможет мне в этомкак заменить переменную в сценарии оболочки

function traverse() { 
    for file in "$1"/* 
    do 
    if [ ! -d "${file}" ] ; then 
     if [ ${file: -2} == ".c" ] 
     then 
     ./sed.sed "$file" > latest_log.txt #To remove all the comments 
     grep -nir "$2" latest_log.txt >> output.log #grep matched lines 
     sed -i "s/^/$file/" output.log > grepoutput3.txt #prefix filename($file here) 
     echo "${file} is a c file" 
     fi 
    else 
     traverse "${file}" "$2" 
    fi 
    done 
} 

function main() { 
    traverse "$1" "$2" 
} 

main "$1" "$2" 

следующую строку следует добавить имя файла в качестве префикса, но $ файл не заменяется, кроме того, что весь скрипт работает нормально.

sed -i "s/^/$file/" ex.txt > grepoutput3.txt 

EX: поиск "прием" во всех .c файлов в folder.Take first_file.c является один.

FIRST_FILE.C

приветствовать здесь

/* Добро пожаловать здесь */

// приветствовать здесь

приветствовать здесь 2

Ожидаемый результат

/DIR/FIRST_FILE.C: 1: добро пожаловать здесь

/DIR/FIRST_FILE.C:4: добро пожаловать здесь 2

с моим сценарием, выход

1: Добро пожаловать здесь

4: Добро пожаловать здесь 2

Итак, я пытаюсь для префикса имени файла (/DIR/FIRST_FILE.C) для каждой строки. Мы можем получить это имя файла из $ file, но sed не интерпретирует его.

ответ

0

Нигде в вашем скрипте нет кода, который создает ex.txt. Это предназначено? Чтобы отладить это, запустите свой скрипт под set -x рядом с началом.

Также стоит отметить: вы отметили этот вопрос «ш» (не баш), но

if [ ${file: -2} == ".c" ] 

полон непереносимого bashisms: оператор строки равенства = и синтаксис ${file: -2} не понят POSIX шиллинг Эквивалентный код ш будет использовать

case $file in 
(*.c) ...;; 
esac 
+0

Thaks для ответа. да, ex.txt там неверен, это должно быть output.log. Моя проблема заключается в том, как я могу заменить файл $ (который является .c файлом) в команде sed.Я хочу префикс этого имени файла для вывода, сгенерированного grep. –

0

Для файловой системы обхода: Использование find!

find FOLDER -type f -name '*.c' -exec bash yourscript.sh {} \; 

В yourscript.sh вы можете получить доступ к имени файла в $1.

Я мог бы помочь в реализации этого скрипта, но довольно сложно понять, что вы пытаетесь сделать.

+0

Спасибо за ответ. С моим сценарием я предоставляю каталог и строку в качестве входных данных, где все строки, присутствующие в папке, должны быть grepped. Исключением является то, что мы не должны печатать строку, присутствующую в комментариях. Для этого я просматриваю каждый файл. Сначала я я удаляю комментарии и grepping для строки. Поскольку мне также нужно указать имя файла, я пытаюсь использовать $ file, чтобы добавить его в качестве префикса, который не работает. –

+0

Это все еще неясно для меня. Можете ли вы изменить свой вопрос и добавить некоторые примеры данных и ваш ожидаемый результат? – hek2mgl

+0

Пожалуйста, проверьте код примера –