In the below script,I want to add the file name as prefix to each output line generated by grep. I dont know why this is not replacing the filename with $file,I am getting the $file as the prefix.can anyone help me on this
在下面的脚本中,我想将文件名作为前缀添加到grep生成的每个输出行。我不知道为什么这不是用$ file替换文件名,我得到$ file作为前缀。任何人都帮我这个
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"
The below line should add the filename as prefix,but $file not replacing,Apart from that whole script is working fine.
下面的行应该添加文件名作为前缀,但$ file不替换,除了整个脚本工作正常。
sed -i "s/^/$file/" ex.txt > grepoutput3.txt
EX: search for "welcome" in all .c files of a folder.Take first_file.c is one.
EX:在文件夹的所有.c文件中搜索“welcome”。获取first_file.c是一个。
FIRST_FILE.C
welcome here
/* welcome here */
/* 欢迎到这里 */
//welcome here
welcome here2
Expected output
/DIR/FIRST_FILE.C:1: welcome here
/DIR/FIRST_FILE.C:1:欢迎来到这里
/DIR/FIRST_FILE.C:4: welcome here2
/DIR/FIRST_FILE.C:4:欢迎来到这里2
with my script ,output is
用我的脚本,输出是
1: welcome here
1:欢迎来到这里
4: welcome here2
4:欢迎来到这里2
So,I am trying to prefix the file name (/DIR/FIRST_FILE.C) to each line.we can fetch that filename from $file,But sed is not interpreting it .
所以,我试图将文件名(/DIR/FIRST_FILE.C)添加到每一行。我们可以从$ file获取该文件名,但是sed没有解释它。
2 个解决方案
#1
0
Nowhere in your script is any code that creates ex.txt
. Is that intended? To debug this, run your script under set -x
near the beginning.
您的脚本中没有任何代码可以创建ex.txt。这是有意的吗?要调试它,请在开头附近的set -x下运行脚本。
Also worth noting: you have tagged this question "sh" (not bash) but
另外值得注意的是:你已经标记了这个问题“sh”(不是bash)但是
if [ ${file: -2} == ".c" ]
is full of nonportable bashisms: the string equality operator is =
and the ${file: -2}
syntax is not understood by a POSIX sh. An equivalent sh code would use
充满了不可移植的bashisms:字符串相等运算符是=并且POSIX sh不理解$ {file:-2}语法。将使用等效的sh代码
case $file in
(*.c) ...;;
esac
#2
0
For the filesystem traversal: Use find
!
对于文件系统遍历:使用find!
find FOLDER -type f -name '*.c' -exec bash yourscript.sh {} \;
In yourscript.sh you can access the filename in $1
.
在yourscript.sh中,您可以访问$ 1中的文件名。
I could help further with implementing that script but it is pretty unclear what you are trying to do.
我可以帮助进一步实现该脚本,但目前还不清楚你要做什么。
#1
0
Nowhere in your script is any code that creates ex.txt
. Is that intended? To debug this, run your script under set -x
near the beginning.
您的脚本中没有任何代码可以创建ex.txt。这是有意的吗?要调试它,请在开头附近的set -x下运行脚本。
Also worth noting: you have tagged this question "sh" (not bash) but
另外值得注意的是:你已经标记了这个问题“sh”(不是bash)但是
if [ ${file: -2} == ".c" ]
is full of nonportable bashisms: the string equality operator is =
and the ${file: -2}
syntax is not understood by a POSIX sh. An equivalent sh code would use
充满了不可移植的bashisms:字符串相等运算符是=并且POSIX sh不理解$ {file:-2}语法。将使用等效的sh代码
case $file in
(*.c) ...;;
esac
#2
0
For the filesystem traversal: Use find
!
对于文件系统遍历:使用find!
find FOLDER -type f -name '*.c' -exec bash yourscript.sh {} \;
In yourscript.sh you can access the filename in $1
.
在yourscript.sh中,您可以访问$ 1中的文件名。
I could help further with implementing that script but it is pretty unclear what you are trying to do.
我可以帮助进一步实现该脚本,但目前还不清楚你要做什么。