我正在编写一个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}},然后包含案例以涵盖这一点。
答案 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不是可接受的值,则必须用默认值替换它。