Sed函数(Bash)-更改注释行的方式
我有这样的任务要做,但我不知道如何用sed函数编写它。 我必须从以下位置更改文件中的注释方式:Sed函数(Bash)-更改注释行的方式,bash,sed,Bash,Sed,我有这样的任务要做,但我不知道如何用sed函数编写它。 我必须从以下位置更改文件中的注释方式: //something6 //something4 //something5 //something3 //something2 //something6 //something4 //something5 //something3 //something2 到 从 到 从 到 从 到 这4种模式必须由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 "$@"