AIX下批量替换文件中的字符串 linux替换包含换行符的内容

162 阅读2分钟

 示例:将所有CPP文件中的__cplusplus替换为 __cplusplus_xsz

perl -p -i -e "s/__cplusplus/__cplusplus_xsz/g"  *.cpp

分隔符是可以换为其它的:以避免你的关键字字符串中有分隔符。

perl -p -i -e "s|__cplusplus|__cplusplus_xsz|g"  *.cpp

如果提示: 

syntax error at -e line 1, at EOF

说明你的字符串中有需要转义的。典型的如 '{'

你可以通过一个个的来尝试判断是哪个字符需要转义处理。例如你怀疑 ''

perl -p -i -e "s||aa|g" a.txt  看看还有没有错误提示。

修复aix下此类编译错误:line 405.4: 1506-191 (E) The character @ is not a valid C source character.

perl -p -i -e "s|///@}|//|g"  *.h 
perl -p -i -e "s|///@{|//|g"  *.h

perl -p -i -e "s|///@}||g"  libwebsockets/include/libwebsockets/.h 
perl -p -i -e "s|///@{||g"  libwebsockets/include/libwebsockets/
.h
perl -p -i -e "s|//@}||g"  libwebsockets/include/libwebsockets/.h 
perl -p -i -e "s|//@{||g"  libwebsockets/include/libwebsockets/
.h

perl -p -i -e "s|///@}||g"  libwebsockets/include/libwebsockets/abstract/protocols/.h
perl -p -i -e "s|///@{||g"  libwebsockets/include/libwebsockets/abstract/protocols/
.h
perl -p -i -e "s|//@}||g"  libwebsockets/include/libwebsockets/abstract/protocols/.h
perl -p -i -e "s|//@{||g"  libwebsockets/include/libwebsockets/abstract/protocols/
.h

linux下替换的内容包含换行符该怎么做呢:

如文件中有以下三行:

/usr/bin/test

/usr/bin/backup_cleaner

/usr/bin/test2

需要将第二行删除,可以采用如下命令

sed -i ":a;N;s|\n/usr/bin/backup_cleaner||g;ta"  *.spec

实际我使用时,有一部分.spec文件中第二行没有被替换,原因不明。使用了如下命令后,才替换掉:

sed -i ":a;N;s|\n/usr/bin/backup_cleaner||g;!ba" .spec     (与上一命令相比,只是末尾为g;!ba"  *.spec          (与上一命令相比,只是末尾为g;!ba)

替换内容中只是包含空格,如/usr/bin/backup_cleaner前面有空格,需要一起去除掉。可以用以下perl或sed命令都行。

perl -p -i -e "s| /usr/bin/backup_cleaner||g"  *.spec

sed -i "s| /usr/bin/backup_cleaner||g"  *.spec

参考的文章:linux sed命令,如何替换换行符“\n”_Jakou的博客-CSDN博客_sed替换\n