2014-11-21 63 views
2

在排除重新引导崩溃的故障时,我需要将文件中的每一行都打印到输出控制台。我想要做的是运行Linux命令行或脚本采取在一个文件中的每一行,并把打印语句后,包含该行,因此,例如:向前一行输出的文件中的每一行添加一条打印语句作为输出

while x<100 
    x=x+1 
end while 

将成为

while x<100 
print "while x<100" 
    x=x+1 
    print "x=x+1" 
end while 
print "end while" 

更妙的是如果打印语句可能包括行号:

while x<100 
print "Line 50: while x<100" 
    x=x+1 
    print "Line 52:x=x+1" 
end while 
print "Line 54: end while" 

这里的想法是找到执行因为这将是可能CAU行脚本中的最后一行sed设备重启。目前我手动执行此操作,添加所有这些行相当耗时。

我知道SED和AWK的存在,但从来没有使用过它们,我经常使用ex/vi/grep/ls/wc来排序文本文件,并且有基本的shell脚本经验。

编辑:请注意,我的问题中的代码都不是shell脚本。我正在寻找帮助来创建shell脚本或命令行来处理文件,以便文件中的每一行都跟着包含上一行的打印语句。

+0

知道用什么语言你的代码中,要知道如何逃生的数据是非常重要的当你的代码行已经包含引号时的打印语句。 – 2014-12-21 02:47:37

+0

阅读你的目的与答案,对我来说,似乎你试图测试你的脚本,而不是正确地调试它。一种方法喜欢[this](http://stackoverflow.com/questions/21190771/how-to-properly-debug-a-bash-script)使用'set -xv'或'extdebug',看起来更可行。 – 2014-12-21 10:43:35

回答

2
awk '{printf("%s\nprint \"Line %s : %s\"\n",$0,++NR, $0)}' infile > outfile 

while x<100 
print "Line 2 : while x<100" 
    x=x+1 
print "Line 4 :  x=x+1" 
end while 
print "Line 6 : end while" 

$0是每行的内容,NR是行/记录号。


对于已经有报价和报表打印的线条,使用下面的修改awk命令:

awk '{printf("%s\nprint \"Line %s : ",$0,++NR)} {gsub(/\"/,"\\\"");printf $0"\"\n"}' infile > outfile 
+0

谢谢,你的答案在我的想法中也暴露了一些缺陷,现在我需要弄清楚如何处理已经有引号和打印语句的行,可能只需添加一个“前面的内容:可能会工作 – alphablender 2014-12-22 20:24:04

+1

@alphablender更新了处理行的答案有引号。 – 2014-12-23 11:47:22

1

那么,一个基本的击外壳脚本将是

while read -r line 
do 
    echo "$line" 
    printf "print \"%q\"\n" "$line" 
done 

此仅使用bash的内建并且意味着被放置在脚本文件中(在该终端输入它可能会混淆read命令)。它目前需要从stdin输入,但重定向操作符(如command < file.txt)将解决该问题。

还要注意在调用printf时使用%q格式说明符,它确保可以将返回的结果传回到shell中以获取相同的文本。

+0

输出不干净,似乎是相反的顺序,并且线条被一起冲洗,而且每条输出线都有一个打印语句,而不是每隔一行 – alphablender 2014-12-22 20:17:09

+0

@alphablender请参阅我的编辑,我添加了一个换行符''printf''函数来解决它。 – randomusername 2014-12-23 04:01:17

+0

您还需要在'echo“$ line”'中加双引号,否则'line'中的任何元字符将被shell解释(重定向,通配符,变量扩展...浩浩荡荡)。同样,你应该使用'read -r'来为'read'提供更少的“有用”语义。 – tripleee 2014-12-23 04:56:18