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

时间:2015-03-25 15:15:42

标签: bash sed

我有这样的任务要做,但我不知道如何用sed函数编写它。 我必须在以下文件中改变评论方式:

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

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

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

/*something6
something4
something5
something3
something2*/

来自

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

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

来自

/*something6
something4
something5
something3
something2*/

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

这4种模式必须由sed函数制作(我想但不确定)。 尝试做但没有运气。我可以将单个单词替换为其他单词,但如何更改评论方式?没有线索。非常感谢帮助和帮助。

1 个答案:

答案 0 :(得分:0)

鉴于任务是:

  

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

     

我试图使用典型的:

 sed -i 's/'"$lookingfor"'/'"$changing"'/g' $filename

在这种情况下,$lookingfor$changing或两者都将包含斜杠,因此正如您所正确观察的那样,简单的公式不起作用。

只要您知道可以选择任意字符来分隔//命令的各个部分,例如{{{},/*注释转换为s///注释很容易1}}。因此,例如,您可以使用:

%

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

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

/*

在你进入之前:

/* A single line comment */

/*
** A multiline comment
*/

是包含两个注释的单行,包含字符串外部文本的字符串看起来像注释。这是我刻意忽略的!或者,更确切地说,我很乐意在转换为:

时决定它是否可以
/* OK */ "/* OK */" /* Really?! */

根本不是一样的,但是你首先要写出复杂的C语言。

您可以使用以下内容处理第一种情况:

// OK */ "/* OK */" /* Really?!

我有分组大括号和sed -e '\%/\*\(.*\)\*/% { s%%//\1%; n; }' 命令,以便单行注释也不匹配第二种情况:

n

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

  1. }转换为/*anything,然后从下一行开始。
  2. //anything转换为anything*/,然后从下一行开始。
  3. 转换任何其他行,以便保留前导空格,但将//anything放在后面。
  4. 如果评论是恶意形成的,这仍然是非常容易被破坏的。例如:

    //

    映射到:

    //注释int x = 0;

    修复这样的问题,以及带字符串的示例,我甚至都没有开始尝试/* a comment */ int x = 0; 。在你进入合法但令人难以置信的C评论之前,这就是:

    sed

    其中只包含两条​​评论(但确实包含两条评论!)。在你决定处理三字符之前(/\ \ * comment *\ \ / /\ /\ noisiness \ commentary \ continued 是一个反斜杠)。等

    因此,对C到C ++注释转换的适度近似是:

    ??/

    我假设你没有使用C shell;如果你是,你需要在脚本的行末端添加更多的反斜杠,以便正确处理多行单引号sed -e '\%/\*\(.*\)\*/% { s%%//\1%; n; }' \ -e '\%/\*%,\%\*/% { \%/\*% { s%/\*\(.*\)%//\1%; n; } \%\*/% { s%\(.*\)\*/%//\1%; n; } s%^\( *\)%\1//% }' \ -i.bak "$@" 命令。