【问题标题】:Append a print statement to every line in a file with the previous line as output将打印语句附加到文件中的每一行,并将前一行作为输出
【发布时间】:2014-11-21 21:28:11
【问题描述】:

在对重启崩溃进行故障排除时,我需要将文件中的每一行都打印到输出控制台。我想要做的是运行一个 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"

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

我知道 SED 和 AWK 的存在,但从未使用过它们,但我确实经常使用 ex/vi/grep/ls/wc 来整理文本文件中的内容,并且有基本的 shell 脚本编写经验。

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

【问题讨论】:

  • 知道你的代码是什么语言很重要,当你的代码行已经包含引号时,知道如何在打印语句中转义数据。
  • 通过答案阅读您的目的,在我看来,您似乎试图检测您的脚本而不是正确调试它。像this 这样使用set -xv 或extdebug 的方法,看起来更可行。

标签: linux shell command-line


【解决方案1】:
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

【讨论】:

  • 谢谢,您的回答也暴露了我的一些想法,现在我需要弄清楚如何处理已经有引号和打印语句的行,可能只是在 : 前面添加一个 " 可能工作
  • @alphablender 如果已经有引号,则更新处理行的答案。
【解决方案2】:

嗯,一个基本的 Bash shell 脚本应该是

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

这仅使用 bash 内置函数,并且旨在放置在脚本文件中(在终端输入可能会混淆 read 命令)。它目前从标准输入接收输入,但重定向运算符(如 command &lt; file.txt)将解决此问题。

还要注意在对printf 的调用中使用了%q 格式说明符,它确保可以将生成的输出传递回shell 以从中获取相同的文本。

【讨论】:

  • 输出不干净,看起来顺序相反,行被弄乱了,而且,每一个输出行都有一个打印语句,而不是每一行
  • @alphablender 查看我的编辑,我在printf 函数中添加了一个换行符来修复它。
  • 您还需要在echo "$line" 中添加双引号,否则line 中的任何元字符都将被shell 解释(重定向、通配符、变量扩展......破坏)。同样,您应该使用read -r 为read 提供不太“有用”的语义。
  • @tripleee true,我已经添加了这些
  • 正如我在第一条评论中所说,输出不干净,我的意思是,它在单词之间充满了反斜杠: txtfer=createobject("rourltransfer") print "txtfer=createobject (\"rourltransfer\")" 粘贴到 Stack Overflow 评论框中我丢失了一些反斜杠,所以你看不到它有多糟糕,但它很严重
猜你喜欢
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
相关资源
最近更新 更多