在solaris上使用sed将一行替换为两行
我想将所有出现的在solaris上使用sed将一行替换为两行,sed,newline,solaris,Sed,Newline,Solaris,我想将所有出现的#include替换为#include,后跟使用名称空间std的在下一行。 我如何在Solaris上为几个文件使用sed 例如,假设我有两个类似于以下的头文件: .... #include <string> .... .... #include <string> using namespace std; .... $cat一些文件 /*代码*/ #包括 /*代码*/ $sed'/#使用名称空间std;包含/a'一些文件 /*代码*/ #包括 使用名称空
#include
替换为#include
,后跟使用名称空间std的代码>在下一行。
我如何在Solaris上为几个文件使用sed
例如,假设我有两个类似于以下的头文件:
....
#include <string>
....
....
#include <string>
using namespace std;
....
$cat一些文件
/*代码*/
#包括
/*代码*/
$sed'/#使用名称空间std;包含/a'一些文件
/*代码*/
#包括
使用名称空间std;
/*代码*/
解释:/#include/
搜索“#include
”,然后命令a
a将显示字符串“使用命名空间std;
”
另请参见。sed'/#include/a\
使用名称空间std;
"档案"
在匹配项的换行符后追加\
,并添加带换行符的字符串。最好的解决方案可能是使用/usr/xpg4/bin/sed
,但是如果您想使用旧版本,请记住旧版本的sed
对于换行非常特别。您可能需要在sed命令中使用文字换行符。尝试:
$ sed '/#include <string>/a\
using namespace std;
' input-file > output-file
$sed'/#包含/a\
使用名称空间std;
'输入文件>输出文件
另一个选择是:
$ echo using namespace std; > tmp-file
$ sed '/#include <string>/rtmp-file' input-file > output-file
$echo使用名称空间std;>tmp文件
$sed'/#include/rtmp file'输入文件>输出文件
sed仅用于对单个行进行简单替换。对于任何其他内容,您都应该使用awk:
$ awk '{print} /#include <string>/{print "using namespace std;"}' file
....
#include <string>
using namespace std;
....
$awk'{print}/#include/{print“使用名称空间std;“}”文件
....
#包括
使用名称空间std;
....
除旧的、损坏的awk(Solaris上的/bin/awk)外,上述内容适用于所有系统上的所有awk。在Solaris上使用/usr/xpg4/bin/awk(一种几乎是POSIX的awk)或nawk(一种旧的、功能不太完善的awk)。您的问题太模糊了。更准确地描述您想要做什么,并给出一个示例输入和所需输出。您是否尝试过将
xpg4
版本的sed
放在其他版本之前?第二个选项:r在后面需要一个空格亲爱的“驾车经过”投票人-请注意解释投票结果,以便我可以改进我的答案?这个答案不可能是正确的改进(好吧,也许是……中的1;/#,但这只是一种风格,有人可以合理地认为显式{print}
更优越)。可能是有人认为,如果不是特定的工具,那么使用合适的工具是“错误的”。
$ echo using namespace std; > tmp-file
$ sed '/#include <string>/rtmp-file' input-file > output-file
$ awk '{print} /#include <string>/{print "using namespace std;"}' file
....
#include <string>
using namespace std;
....