根据设计,当您重新编辑带有前导制表符的文件时,GitHub 会自动将所有线索从制表符转换为空格:也就是说,如果您编辑文件,将所有线索从空格更改为制表符,它将以这种方式保存,但如果您重新编辑文件并保存(不更改线索),所有线索将自动转换回空格。
1)保存更改之前的文件编辑模式:
2)保存更改后进行文件编辑:
请注意,当我重新编辑文件时,它是如何从制表符 (4) 返回到空格 (2) 的。
为什么这是一个问题
执行生的curl
带有 ,的远程脚本版本选项卡相关数据(如此处文档), 将失败。它们的执行只会因一些错误而中断,因为它们必须包含前导制表符而不是空格。
这是我用来从 GitHub 执行远程脚本的基本curl
模式如下(对于多个curl,这个。):
curl -s URL | tr -d '\r' | bash
我的问题
有没有办法(可能使用tr
)将所有前导空格更改为制表符,以确保我从 GitHub 运行的远程脚本始终具有前导制表符而不是空格,从而不受 GitHub 这种奇怪行为的影响?
答案1
关于 GitHub 及其编辑器,我不能说太多,因为我从不直接在 Web 界面中编辑 GitHub 文件。
标准实用程序expand
和unexpand
可用于将前导制表符转换为空格 ( expand
) 或将前导空格转换为制表符 ( unexpand
)。
要将前导两个空格更改为制表符(或将四个空格更改为两个制表符等),请使用
unexpand -t 2 file
这也可以用作过滤器,如
somecommand | unexpand -t 2
要使用单个制表符替换任意数量的前导空格,还可以使用 GNU,sed
如下所示:
sed 's/^ */\t/'
图案^ *
是二^
和之间有空格*
。该正则表达式将匹配一个或多个前导空格(如果使用带有or的 GNU,则相当于^ +
或)。 GNU替换将用制表符替换它们( 的其他实现将需要在替换部分中使用文字制表符,而不是)。^ {1,}
sed
-r
-E
sed
sed
\t
我注意到这在 OpenBSD 上不起作用,因为它的实现unexpand
假设每个选项卡有 8 个空格,并且无法识别该-t
标志。不过,上述建议适用于unexpand
GNU coreutils 中的内容。