linux - Bash:如何转换此文本以满足我的需要?

标签 linux bash shell unix sed

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

/* 100 */ "Continue",
/* 101 */ "Switching Protocols",
# ...

对此:

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

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

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

谢谢!

编辑@EdMorton

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

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

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

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

如果最后可以有 C 风格的注释,例如/* 426 */"Upgrade Needed",/* RFC 2817 */,然后也包含案例来涵盖这一点。

最佳答案

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

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

sed s 命令使用 + 作为分隔符(通常使用 /,但注释中也有 /)。 * 需要转义并变为 \*

有趣的 \s*\*/\s* 意思是:可选空格 \s* 后跟一个星号(转义后变成 \*),后跟 / 和可选空格 \s*

关于linux - Bash:如何转换此文本以满足我的需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36386025/

相关文章:

c - mmap 的最小尺寸

linux - 是否可以为每个命令在终端输出的每一行前面加上一个字符?

C语言字符错误

ruby-on-rails - 打开一个新的终端选项卡并在里面运行命令,只有在打开选项卡之后

linux - Bash变量扩展不能与时间命令结合使用

windows - Unix/Linux 系统易受泄漏全局内核对象的影响吗?

linux - Qt - 如何检测应用程序是在 GNOME 还是 KDE 上运行?

c - 如何编写一个简单的 Linux 设备驱动程序?

linux - 将文件分组并通过管道传输到 awk 命令

linux - 检测目录中是否有内容被修改,如果是,则备份 - 否则什么都不做