根据相应源中的内容在编辑器中打开头文件

时间:2018-07-14 18:03:26

标签: linux bash pipe

我有几个名称相同但扩展名不同的文件。例如

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文件?

2 个答案:

答案 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