打不过。
有两个文件:./.hgsub
cmake = common/cmake
qt = common/qt
proj = project/code
js = project/code_js
[subpaths]
^(\w+:\/\/)(([^@:/]+(:[^@:/]+)?@)?[-a-zA-Z0-9_.]+(:[0-9]+)?\/scm\/hg)(\/[^/]+)*(\/[^/]+)\/([^/]+)$ = \1\2\7/\8
./.hgsubstate
89d184e1d854d0bb86d0998cad396bc2ddf81735 cmake
b80783d4ef42b23936ff3bb890a58333a61b4c67 qt
1f05c071fd7df1a6d4b58cbc9bc6f947fb2488b1 js
4a8f4ab29f5af9b829e16068706ce85782f15a62 proj
思路如下:
读取./.hgsub文件的每一行,直到没有空行或 [子路径];
在./.hgsub 中使用'=' 分隔符分割行;
取变量 $1(例如,第一行是 cmake)并从文件./.hgsubstate中输出与给定变量匹配的行;
将此行拆分为 $state1 和 $state2 (不确定是否有必要);
加入来自 ./.hgsub 的 $2 和来自./.hgsubstate的$state1
结果应该是飞走/添加到文件中的common/cmake 89d184e1d85...d396bc2ddf81735行。
最终文件的结果:
common/cmake 89d184e1d854d0bb86d0998cad396bc2ddf81735
common/qt b80783d4ef42b23936ff3bb890a5a61b4c67
project/code 4a8f4ab29f5af9b829e16068706ce85782f15a62
project/code_js 1f05c071fd7df1a6d4b58cbc9bc6f947fb2488b1
UPD:到目前为止,我已经完成了这个。我们需要了解如何连接 ${VAR[0]} $1 并将其放入循环中。
VAR=(`awk -F'=' '{print $1, $2}' ./.hgsub`) | grep ${VAR[0]} ./.hgsubstate | awk -F' ' '{print $1}'
使用bash解释器可以理解的语言编写的程序,当然可以实现所需的,但是会很麻烦。
最好使用更合适的程序进行文本处理。
例如,要合并两个文件中的字段(通过匹配字段),您可以使用join程序(来自gnu/coreuitls 包,如下面提到的程序)。
-1 1和-2 2-o 1.3,2.1全部的:
但是原始形式的现有文件不适合:第一个文件包含额外的行,并且两者都没有按连接程序合并它们的字段排序。
sed -n '1,/^$/p' файл1-k номер-поля.join ... <(команда1) <(команда2)全部的:
根据您的数据,结果是:
如果您需要按第一个字段进行排序,则向排序程序添加另一个调用: