【发布时间】:2015-04-23 01:02:06
【问题描述】:
我想删除行首的双斜杠以取消注释一行代码,例如第一个注释。我的方法适用于许多其他情况,但这次还不够。这是我的文件 .sh 中的一段代码:
while read line
do
if [[ $line == *"#define asdasd"* ]]
then
local prefix="\\/\\/ "
local new=${line#$prefix}
local sub="s/$line/$new/g"
echo "old line: " $line
echo "new line: " $new
echo $sub
perl -pi -e "$sub" $FILE
exit
fi
done < $FILE
编辑:
我的问题比这段代码更复杂。我只想取消注释(删除双斜杠)与模式匹配的一行,而不一定是第一行。这就是为什么我不能对整个文件进行操作,而是逐行操作的原因。所以所有的“perl on match”解决方案都不适用于我的情况。
编辑:
我正在按照一些用户的建议编辑我的问题。
- 背景:我正在使用嵌入式(复杂)操作系统,我无法为自己的目的修改每个文件(即
makefile)。 - 目的:我想多次构建代码,每次都启用不同的标志。
在我当前的解决方案中,我将所有标志收集在一个头文件中,并且在每次构建时只启用一个。这是我的 .h 文件的示例:
#ifndef SYSTEM_H
#define SYSTEM_H
#include <...>
#define BLA 1
#define BLABLA 2
#define BLABLABLA 3
// #define OPT_0 // Options disabled
// #define OPT_1
#define OPT_2 // Option enabled
// #define OPT_...
// #define OPT_...
// #define OPT_N
[...]
#define function(__exp) \
[...]
#endif
如您所见,我不知道我必须启用/禁用多少选项,还有其他#define 说明。
我正在编写一个脚本,它一次启用一个标志并构建项目。每次编译的文件都被重命名以防止覆盖。我的一个解决方案是基于上面列出的代码,但不幸的是 perl 指令不会修改 .h 文件,删除所选行开头的双斜杠。
【问题讨论】:
-
如果您粘贴到 shellcheck.net 中,您会看到一个错误:“确保不要在同一管道中读取和写入同一文件。”。也就是说,您正在循环一个文件并同时对其进行编辑。另外,在我看来,您选择了一种长方法:对文件执行
perl -pi而不循环遍历它不是更好吗? -
我的问题要复杂得多。所以相信我,我必须通读我的文件并检查每一行。
-
好的,那么你必须考虑到你不能改变你正在阅读的内容,因为行为是不可预测的。
-
您的编辑并没有让您更清楚您要做什么,而且您当前的方法本质上是错误的。我强烈建议您编辑澄清,否则我担心没有人能够正确地帮助您。
-
@Zeb:查看我的更新答案。至于具体的问题:只有在最近的更新中,您才明确提到您在使用 Perl 命令时遇到问题 - 为了帮助您解决这个问题,我们显然需要查看它和周围的代码;虽然所有这些都在您的原始问题中,但它缺少具体的问题描述。