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