Bash:我如何改变这个文本以满足我的需求?

时间:2016-04-03 13:33:40

标签: linux bash shell unix sed

我正在编写一个Bash脚本,我需要转换一堆如下所示的行:

case 100: return "Continue";
case 101: return "Switching Protocols";
# ...

到此:

/* 101 */ "Switching Protocols",
/* 425 */ null,
/* 426 */ "Upgrade Required", // RFC 2817
/* 507 */ "Insufficient Storage"
/* 999 */ "Made Up But Could Happen" // RFC 9999

如何使用命令行工具执行此操作?我问的原因是因为我不确定如何捕获'使用regex + sed / grep将变量(100,"继续")转换为新的文本行。

如果你有兴趣,这里是完整输出的要点(请注意,有些行最后没有逗号):https://gist.github.com/aa5d19778844334b3ecd7d98cca67301

谢谢!

@EdMorton编辑

链接文件中显示的实际4种不同的输入样式加上一种不存在但可能发生的输入样式是:

case 101: return "Switching Protocols";
case 425: ?
case 426: ?
case 507: return "Insufficient Storage";
case 999: ?

请提供以下所有内容的预期输出:

/* 426 */ "Upgrade Required", /* RFC 2817 */

如果你最后可以有C风格的评论,例如{{1}},然后包含案例以涵盖这一点。

4 个答案:

答案 0 :(得分:2)

您可以使用简单的sed替换和GNU sed来完成,例如:

sed -r 's+/\*+case+g; s+\s*\*/\s*+: return +g; s+(,\s*)?(//.*)?$+;\2+g' yourfile

sed s个命令使用+作为分隔符(通常使用/,但评论也有/)。 *需要转义并成为\*

有趣的\s*\*/\s*表示:可选的空格\s*后跟一个星标(转义为\*),然后是/,再次是可选的空格\s*

答案 1 :(得分:0)

使用sed:

String

答案 2 :(得分:0)

$ sed -r 's/[^0-9]+([0-9]+).*(".*").*/case \1: return \2;/' file
case 100: return "Continue";
case 101: return "Switching Protocols";

答案 3 :(得分:0)

假设这是一个switch语句的块,这将与更新的输入样式一起使用。

$ sed -r 's_/\*_case_;s_ \*/_: return_;s_("[^"]*")[^;]?_\1;_;s_,$_;_' file          

case 101: return "Switching Protocols";
case 425: return null;
case 426: return "Upgrade Required"; // RFC 2817
case 507: return "Insufficient Storage";
case 999: return "Made Up But Could Happen";// RFC 9999

也会在最后处理丢失的逗号。显然,如果null不是可接受的值,则必须用默认值替换它。