2017-03-02 131 views
0

我想删除文件中字符串/**/之间的所有文本,其中字符串可能出现在不同的行上并围绕注释。比如我想删除它包含/**/之间的以下七行: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

这种德 - 在开头处输入/*,而输入*/但不输入中间文字。

+0

看看你的sed的版本有'-z'选项,这将允许NUL是行分隔符,而不是换行... – Sundeep

+0

相关http://stackoverflow.com/questions/13061785/remove-多行注释 –

+0

如果您知道在评论开始或结束时同一行中没有非评论代码,这并不难,但对于一般情况而言,这更加痛苦。 –

回答

0

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

所以, 1)获得的行号/ *部分 2)获得*/ 3的最后一行数字)你可以使用“而读线;”使用cut或sed循环并剪切每一行。

0

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

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

它的工作方式如下:在两种模式之间的界限则执行{next}实际上跳过线,其他一切只是打印输入。

+0

这给我一个语法错误。你还可以解释这里的语法是如何工作的吗? – 218

+0

初始命令中的else语句实际上存在错误。现在应该没问题。 – mshrbkv

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 
0

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

cpp -P test.txt 
相关问题