在Bash中合并文件

时间:2012-03-01 17:04:42

标签: file bash grep cat

我有一个脚本文件,它使用import和load命令从其他文件引入脚本。我正在尝试将这些脚本转换为新语言,但很难通过所有不同的导入/加载来跟踪变量。我正在尝试编写一个BASH脚本来浏览文件,并从包含/导入文件的内联中导入所有文本。

使用最终解决方案!

sed -e 's/\\/\//g' test.restomatic | awk '{if ($1 ~ /^(LOAD|IMPORT)/) system("cat " $2); else print;}' > /cygdrive/c/bashScripts/testing.txt

原始文件样本:

LOAD ..\..\..\..\GlobalSuccess\IdentityShardCreate_Success.rcq
REPLACE /rest-client/request/url/*shard* "//{$OKEnv}"
EXPECT HEADER SERVER
EXPECT HEADER DATE
EXPECT RETURN-CODE 201
RUN
IMPORT ..\..\..\..\GlobalSuccess\IdentityEnvironmentCreateNewEnvironmentFromShard_Success.rcq
REPLACE /rest-client/request/url/*shard* "//{$OKEnv}/environment"
EXPECT HEADER Server
EXPECT HEADER Date
EXPECT RETURN-CODE 204
RUN
ASSIGN ShardTypeControl 1
LOOP ShardTypeControl
ASSIGN OKShard2 {$ShardNames[{$ShardTypeControl}]}
LOAD ..\..\..\..\GlobalSuccess\IdentityEnvironmentAddShardToEnvironment_Success.rcq
REPLACE /rest-client/request/url/*shard* "//{$OKShard2}/environment/{$OKEnv}"

输出文件的所需结果示例:

Original File (OF) Start
(OF) Line 1
(OF) Line 2
(OF) Line 3
Line 1 of Imported File - would have been (OF) line 4
Line 2 of Imported File
(OF) Line 5
(OF) Line 6
Line 1 of Loaded File - would have been (OF) line 7
Line 2 of Loaded File
Line 3 of Loaded File
(OF) Line 8
Line 1 of Second Imported File - would have been (OF) line 9
Line 2 of Second Imported File

3 个答案:

答案 0 :(得分:3)

所有这些都可以在单个awk命令中组合,如下所示:

awk '{if ($1 ~ /^(LOAD|IMPORT)/) {gsub(/\\/, "/", $2); system("cat " $2)} else print}' test.txt > output.txt

答案 1 :(得分:2)

while IFS= read -r line; do
  case "$line" in
    LOAD *|IMPORT *) cat "${line#* }" ;;
    *) echo "$line" ;;
  esac
done < original.file

对问题中代码的一些评论:

cat /path/original.file | while read $line; do 
if[grep 'IMPORT\|LOAD' $line]; then               
working on it  
else  
working on it: output to file /path/testing.txt  
done
  • 应为while read line(不含$
  • [是一个命令,需要前后空格:if [ grep '...' ... ]; then
  • 让grep读取变量的内容,使用bash的“here-string”重定向
    grep 'IMPORT\|LINE' <<< "$line"
  • 错过了fi声明
  • 的终止关键字if
  • 总是引用变量引用,除非您特别想要关闭引号的副作用。

答案 2 :(得分:0)

根据我在这里可以理解的,您正在尝试使用您正在使用的某种脚本语言(您尚未指定)来内联IMPORT,以便您最终得到包含整个脚本的单个文件,因此然后,您可以尝试将所述脚本转换为另一种(未指定的)语言。

您编写的bash脚本最终会将test.txt中提到的所有文件按照提及的顺序连接到输出文件中 - 它不会导致原始文本和导入文本混合使用后。

我建议采用完全不同的方法。使用sed将IMPORT语句转换为cpp #include语句或m4中的等效语句,然后通过cpp或(尊重地)通过m4运行生成的文件。这有点像黑客攻击,但它会产生你正在寻找的结果。