String Bash:删除双斜杠(取消注释行)

String Bash:删除双斜杠(取消注释行),string,bash,shell,String,Bash,Shell,我想删除一行开头的双斜杠以取消注释一行代码,例如第一行注释。我的方法适用于许多其他情况,但这一次还不够。下面是我文件中的一段代码。sh: while read line do if [[ $line == *"#define asdasd"* ]] then local prefix="\\/\\/ " local new=${line#$prefix} local sub="s/$l

我想删除一行开头的双斜杠以取消注释一行代码,例如第一行注释。我的方法适用于许多其他情况,但这一次还不够。下面是我文件中的一段代码。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
如您所见,我不知道需要启用/禁用多少选项,还有其他
#define
指令

我正在编写一个脚本,一次启用一个标志并构建项目。每次重新命名编译后的文件以防止覆盖。我的一个解决方案是基于上面列出的代码,但不幸的是,perl指令没有修改.h文件,删除所选行开头的双斜杠。

说得很对,但你真的吃了一顿饭

要编辑您感兴趣的行,只需使用Perl:

perl -pi -e 's/^\/\/// if /#define asdasd/' "$FILE"
这将读取您的文件并进行替换,以删除与模式匹配的行开头的斜杠

在本例中它并不短,但您也可以将这两种模式结合起来,如下所示:

perl -pi -e 's/^\/\/(.*#define asdasd)/\1/' "$FILE"
不清楚是否要求只执行一次替换,但如果是,您可以将命令更改为:

perl -pi -e 's/^\/\/// if /#define asdasd/ && !$n++' "$FILE"

$n++
仅在第一次求值时为真,因此只执行一次替换。

您是否可以将sed用于类似的情况

sed -i -e '/#define asdasd/ s,^//,,' $FILE

因此,您只需匹配所需的模式,然后删除双斜杠。

如果您确实需要逐行处理文件,下面介绍如何解决@fedorqui在注释(代码使用
bash
语法)中指出的在循环中读取和写入同一文件的问题:

#概要
#QuotePerlsubs
quotePerlSubst(){

IFS=read-d'-r<如果粘贴到shellcheck.net,您会看到一个错误:“确保不要在同一管道中读写同一文件。”。也就是说,您正在循环一个文件并同时对其进行编辑。另外,在我看来,您选择了一种很长的方法:只对文件执行
perl-pi
,而不进行循环,不是更好吗?我的问题要复杂得多。所以相信我,我必须通读我的文件并检查每一行。好的,那么您必须考虑到你不能改变你正在阅读的内容,因为这种行为将是不可预测的。你的编辑并不能使你想做的事情变得更清楚,你目前的方法本身就是错误的。我强烈建议你编辑以澄清,否则恐怕没有人能正确地帮助你。@Zeb:请看我的报告更新的答案。至于具体的问题:只有在最新的更新中,您才明确提到Perl命令有问题-为了帮助您解决这个问题,我们显然需要查看它和周围的代码;虽然您最初的问题中包含了所有内容,但它缺少具体的问题描述。正如我在注释a中所写的如上所述,我的问题比这段代码更复杂。我想取消注释(删除双斜杠)只有一行与模式匹配,而不一定是第一行。这就是为什么我不能对整个文件进行操作,而是逐行操作的原因。在这种情况下,您需要编辑您的问题,以便更清楚地了解替换的条件。在不知道w的情况下,我们无法根据您当前的方法提出解决方案为什么一定是这样的。我无法想象在一个
循环中调用perl会是一个好主意,尤其是在同一个文件上。刚刚完成!首先感谢你的帮助。我的问题非常具体,我在寻找替换问题的解决方案,而不是我所有的算法方法。下一个蒂姆我会解释我所有的问题。
sed -i -e '/#define asdasd/ s,^//,,' $FILE
while IFS= read -r line; do
  if [[ $line == *"#define asdasd"* ]]
  then
    # ... process "$line" and update "$FILE"
  fi
done <<<"$(< "$FILE")"
local sub="s/$(quotePerlRe "$line")/$(quotePerlSubst "$new")/g"