我有这样的任务要做,但我不知道如何用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函数制作(我想但不确定)。 尝试做但没有运气。我可以将单个单词替换为其他单词,但如何更改评论方式?没有线索。非常感谢帮助和帮助。
答案 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
代替%
作为搜索分隔符。外部分组/
... {
中有三个操作:
}
转换为/*anything
,然后从下一行开始。//anything
转换为anything*/
,然后从下一行开始。//anything
放在后面。如果评论是恶意形成的,这仍然是非常容易被破坏的。例如:
//
映射到:
//注释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 "$@"
命令。