我有几个名称相同但扩展名不同的文件。例如
echo "array" > A.hpp
echo "..." > A.h
echo "content" > B.hpp
echo "..." > B.h
echo "content" > C.hpp
echo "..." > C.h
我想根据相应*.h
文件中的某些内容获取*.hpp
文件的列表。尤其是我正在寻找一种单线打开它们在我的编辑器中。
可以假设每个*.hpp
文件都有相应的*.h
文件。另外,由于它们是源文件,因此可以假定文件名不包含空格。
我知道如何根据文件内容获取*.hpp
文件的列表。
find . -type f -iname '*.hpp' -print | xargs grep -i 'content' | cut -d":" -f1
给出
./B.hpp
./C.hpp
然后在编辑器中打开
st `find . -type f -iname '*.hpp' -print | xargs grep -i 'content' | cut -d":" -f1`
但是如何获取/打开相应的*.h
文件?
答案 0 :(得分:2)
您说要基于相应*.h
文件中的某些内容获取*.hpp
文件的列表。
while read -r line ; do
echo "${line%.hpp}.h"
done < <(grep -i 'content' *.hpp| cut -d":" -f1)
BashFAQ 001建议使用while
循环和read
命令来读取数据流。
按要求提供一线
st `while IFS= read -r line ; do echo "${line%.hpp}.h"; done < <(grep -i 'content' *.hpp| cut -d":" -f1)`
如果要处理包含空格的文件名,则需要使用printf
而不是echo。
st `while IFS= read -r line ; do printf '%q' "${line%.hpp}.h"; done < <(grep -i 'content' *.hpp| cut -d":" -f1)`
%q
使printf格式化输出,以便可以将其重新用作shell输入。
说明
您必须从后面阅读它。首先,我们将当前目录中所有以.hpp
结尾的所有文件替换为字符串'content'
,并剪切除基本名称以外的所有内容。
while循环将读取grep的输出,并将基本名称分配给变量line
。
在while循环中,我们使用bash的parameter substitution将文件扩展名从.h
更改为.hpp
。
答案 1 :(得分:1)
您的问题仍然不清楚,但这就是您要尝试做的所有事情(对gensub()
使用GNU awk)吗?
$ awk '/content/{print gensub(/[^.]+$/,"h",1,FILENAME)}' *.hpp
B.h
C.h