sed删除不同行上两个字符串之间的字符

时间:2017-03-02 15:20:55

标签: linux bash sed

我想删除文件中字符串/**/之间的所有文本,其中字符串可能出现在不同的行上并围绕注释。例如,我想删除/**/之间包含的以下七行:

/* "CyIHTAlgorithm.pyx":81
 * @cython.wraparound(False)
 * @cython.cdivision(True)
 * cdef inline object IHTReconstruction2D(fType_t[:,:] data,             # <<<<<<<<<<<<<<
 *                         fType_t[:,:] residualFID,
 *                         fType_t[:,:] CS_spectrum,
 */

我已经设法使用sed执行此操作,其中字符串出现在同一行: sed -i.bak 's/\(\/\*\).*\(\*\/\)/\1\2/' test.txt 但是我不确定如何将它扩展到同一个文件中的多行:

我也尝试过: sed -i.bak '/\/\*/{:a;N;/\*\//!ba;s/.*\/\*\|\*\/.*//g}' test.txt遵循此处的提示(Extract text between two strings on different lines

这会删除开头的/**/,但不会删除介入文本。

5 个答案:

答案 0 :(得分:2)

为什么不使用sed范围?

$ cat tmp/file13
first line
/* "CyIHTAlgorithm.pyx":81
 * @cython.wraparound(False)
 * @cython.cdivision(True)
 * cdef inline object IHTReconstruction2D(fType_t[:,:] data,             # <<<<<<<<<<<<<<
 *                         fType_t[:,:] residualFID,
 *                         fType_t[:,:] CS_spectrum,
 */
before last line
last line

$ sed '/\/\*/,/\*\//d' tmp/file13
first line
before last line
last line

答案 1 :(得分:0)

你可以使用sed或cut,但它们实际上是为一个模式设计的,所以每一行都应该匹配它。  你应该通过获取开始和结束的木材行来声明第一行和最后一行,然后你可以将它包装成一个函数。

所以, 1)获取/ *部分的行号 2)获取* /的最后一个行号 3)你可以使用“while read line;”使用cut或sed循环并切割其间的每一行。

答案 2 :(得分:0)

awk真的更适合这种事情。它supports开箱即用/pattern/,/pattern2/语法。

awk '/[:space:]*\/\*/,/[:space:]*\*\// {next} {print}' file.txt

它的工作方式如下:对于两个模式之间的行,它执行{next}实际上跳过该行,其他所有内容只是打印输入。

答案 3 :(得分:0)

以下将尝试做更多,所以首先测试它是否符合您的需求。

cpp -P test.txt

答案 4 :(得分:0)

我在这里找到答案:https://askubuntu.com/questions/916424/how-to-replace-text-between-two-patterns-on-different-lines

sed -n '1h; 1!H; ${ g; s/<head>.*<\/head>/IF H = 2 THEN\n  INSERT FILE 'head.bes'\nEND/p }' myProgram.bes

注意:这会将HTML文档中<head> ... </head>(包括)之间的所有行替换为:

IF H = 1 THEN
  INSERT FILE 'head.bes'
END