Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sed函数(Bash)-更改注释行的方式_Bash_Sed - Fatal编程技术网

Sed函数(Bash)-更改注释行的方式

Sed函数(Bash)-更改注释行的方式,bash,sed,Bash,Sed,我有这样的任务要做,但我不知道如何用sed函数编写它。 我必须从以下位置更改文件中的注释方式: //something6 //something4 //something5 //something3 //something2 //something6 //something4 //something5 //something3 //something2 到 从 到 从 到 从 到 这4种模式必须由sed函数生成(我猜,但不确定)。 我试过了,但运气不好。我可以把一个词换成其他词,但是如何改变

我有这样的任务要做,但我不知道如何用sed函数编写它。 我必须从以下位置更改文件中的注释方式:

//something6
//something4
//something5
//something3
//something2
//something6
//something4
//something5
//something3
//something2

这4种模式必须由sed函数生成(我猜,但不确定)。
我试过了,但运气不好。我可以把一个词换成其他词,但是如何改变评论的方式呢?没有线索。非常感谢您的帮助和帮助。

鉴于任务是:

请编写允许更改源文件中注释样式的脚本,例如:
/**/转到
/…
。注释的样式是脚本的一个参数

我试着使用典型的:

 sed -i 's/'"$lookingfor"'/'"$changing"'/g' $filename
在此上下文中,
$lookingfor
$changing
或两者都将包含斜杠,因此简单的公式不起作用,正如您正确观察到的那样

只要您知道可以选择任意字符分隔
s//
命令的各个部分,例如
%
,就可以轻松地将
/
注释转换为
/*
注释。例如,您可以使用:

sed -i.bak -e 's%// *\(.*\)%/*\1 */%'
这将查找后跟零个或多个空格的双斜杠和任何内容,并将其转换为
/*anything*/

/*
注释的转换要困难得多。有两种情况需要关注:

/* A single line comment */

/*
** A multiline comment
*/
那是在你进入之前:

/* OK */ "/* OK */" /* Really?! */
这是一行,包含两个注释和一个字符串,该字符串包含字符串外部看起来像注释的文本。这是我故意忽略的!或者,更准确地说,我正在认真地决定,当转换为:

// OK */ "/* OK */" /* Really?!
这一点都不一样,但首先要为编写复杂的C语言服务

您可以通过以下方式处理第一个案例:

sed -e '\%/\*\(.*\)\*/% { s%%//\1%; n; }'
我在其中使用了分组大括号和
n
命令,因此单行注释与第二种情况不匹配:

    -e '\%/\*%,\%\*/% {
            \%/\*% { s%/\*\(.*\)%//\1%; n; }
            \%\*/% { s%\(.*\)\*/%//\1%; n; }
            s%^\( *\)%\1//%
        }'
第一行选择一个匹配的
/*
和下一个匹配的
*/
之间的一系列行。
\%
告诉
sed
使用
%
而不是
/
作为搜索分隔符。在外部分组
{
..
}
中有三个操作:

  • /*anything
    转换为
    //anything
    并从下一行开始
  • anything*/
    转换为
    //anything
    并从下一行开始
  • 转换任何其他行,使其保留前导空格,但在其后面放置
    /
  • 如果评论是恶意形成的,那么这仍然很容易被颠覆。例如:

    /* a comment */ int x = 0;
    
    映射到:

    //注释int x=0

    修复这样的问题,以及使用字符串的示例,是我在
    sed
    中都不会尝试的事情。那是在你进入合法但难以置信的C评论之前,比如:

    /\
    \
    * comment
    *\
    \
    /
    /\
    /\
    noisiness \
    commentary \
    continued
    
    只包含两条注释(但确实包含两条注释!)。在你决定处理三角图之前(
    ?/
    是反斜杠)。等等

    >,对C到C++注释转换的适度近似为:

    sed -e '\%/\*\(.*\)\*/% { s%%//\1%; n; }' \
        -e '\%/\*%,\%\*/% {
                \%/\*% { s%/\*\(.*\)%//\1%; n; }
                \%\*/% { s%\(.*\)\*/%//\1%; n; }
                s%^\( *\)%\1//%
            }' \
        -i.bak "$@"
    

    我假设您没有使用C shell;如果是,则需要在脚本中的行末尾添加更多反斜杠,以便正确处理多行单引号
    sed
    命令。

    我投票将此问题作为主题外的问题结束,因为它没有显示搜索努力。这类事情通常有点困难,因为您将从一个面向行的注释变成一个分隔的注释。您需要先提取注释,然后重新插入。例如,您将如何处理:
    某个东西\u不\u注释//一些注释
    @Darth我的意思是您自己尝试过吗?这在awk中很琐碎,是否必须使用它?向我们展示您尝试过的内容。另外,“待替换”和“替换为”两对块之间的区别是什么?前两个是将C++风格的注释转换为复杂的C风格注释;后两个正在做对话。评论的文本真的是固定的吗?街区里总是有5条线吗?C风格的注释是否真的必须与最后一条注释文本在同一行上的尾随
    */
    一样?
    // OK */ "/* OK */" /* Really?!
    
    sed -e '\%/\*\(.*\)\*/% { s%%//\1%; n; }'
    
        -e '\%/\*%,\%\*/% {
                \%/\*% { s%/\*\(.*\)%//\1%; n; }
                \%\*/% { s%\(.*\)\*/%//\1%; n; }
                s%^\( *\)%\1//%
            }'
    
    /* a comment */ int x = 0;
    
    /\
    \
    * comment
    *\
    \
    /
    /\
    /\
    noisiness \
    commentary \
    continued
    
    sed -e '\%/\*\(.*\)\*/% { s%%//\1%; n; }' \
        -e '\%/\*%,\%\*/% {
                \%/\*% { s%/\*\(.*\)%//\1%; n; }
                \%\*/% { s%\(.*\)\*/%//\1%; n; }
                s%^\( *\)%\1//%
            }' \
        -i.bak "$@"