首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Bash中合并文件

在Bash中合并文件
EN

Stack Overflow用户
提问于 2012-03-02 01:04:42
回答 3查看 590关注 0票数 2

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

使用的最终解决方案!

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

原始文件示例:

代码语言:javascript
复制
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}"

输出文件的期望结果示例:

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-02 01:24:34

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

代码语言:javascript
复制
awk '{if ($1 ~ /^(LOAD|IMPORT)/) {gsub(/\\/, "/", $2); system("cat " $2)} else print}' test.txt > output.txt
票数 3
EN

Stack Overflow用户

发布于 2012-03-02 02:22:11

代码语言:javascript
复制
while IFS= read -r line; do
  case "$line" in
    LOAD *|IMPORT *) cat "${line#* }" ;;
    *) echo "$line" ;;
  esac
done < original.file

对问题中的代码进行一些注释:

代码语言:javascript
复制
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

此处字符串应为此处(没有$)

  • [是一个命令,并且前后需要空格:if [ grep '...' ... ]; then

  • to让grep读取变量的内容,使用bash的“-
  • ”重定向

为statement

  • always引用变量引用grep 'IMPORT\|LINE' <<< "$line"

  • missing终止关键字fi,除非您特别想要去掉引号的副作用。
票数 2
EN

Stack Overflow用户

发布于 2012-03-02 01:15:25

据我所知,您正在尝试使用您正在使用的某种脚本语言(您尚未指定)内联导入,以便最终得到一个包含整个脚本的文件,这样您就可以开始尝试将该脚本转换为另一种(未指定的)语言。

您编写的bash脚本最终会将test.txt中提到的所有文件按照它们被提及的顺序连接到一个输出文件中--它不会产生您想要的原始文本和导入文本的混合。

我会建议一种完全不同的方法。使用sed将导入语句转换为cpp #include语句或m4中的等效语句,然后通过cpp或m4 (相应地)运行结果文件。这是一个小技巧,但它会产生你想要的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9520619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档