用于替换特定字符串的sed,在多个行之间,这些行之间是某些模式

时间:2014-01-03 18:54:14

标签: bash sed

我有一个简单的问题(我认为),我需要替换一个文件(verilog)中多行中出现的特定字符串。这些行本身在特定模式之间

前:

lk
lk
lk
lk
lk

//comment1
input [5:0]a,
input [3:0]b,
input c,
input [4:0]d,
input f,

//comment2
lm
lm
lm
lm

我需要在“comment1”和“comment2”之间用“逻辑”替换“输入”,将它们保留在最终结果中(引用不包括在内,仅用于理解)

现在我拥有的是

sed '/\/comment1/,/\/comment2/s/input/logic/g' file1.sv > file2.sv

我得到的结果是

lk
lk
lk
lk
lk

//comment1
logic
logic
logic
logic
logic

//comment2
lm
lm
lm
lm

逻辑消失后的其余文本,我需要保留

有人可以帮忙,我将不胜感激......

2 个答案:

答案 0 :(得分:1)

您可以使用此sed命令:

sed -i.bak '/\/\/comment1/,/\/\/comment2/s/\<input\>/logic/g' file
  • /\/\/comment1/,/\/\/comment2/将在2个评论栏之间搜索文字
  • \<input\>用于将输入与字边界匹配
  • s/\<input\>/logic/g用于将“input”替换为“logic”

答案 1 :(得分:0)

我刚刚测试了你的sed命令,对我来说它完美无缺。我唯一能看到错误的是你忘记了注释行前面的最后一个斜线。无论哪种方式,它都适合我,但正确的行将是

sed '/\/\/comment1/,/\/\/comment2/s/input/logic/g' file1.sv > file2.sv

正如您所看到的,我在每个评论行中都有一个“/”。尝试一下,看看它是否有帮助。 我在这里运行GNU sed版本4.2.1。

要回答有关在脚本中从命令行读取文件名的注释中的问题,这将是最简单的方法

#!/bin/bash
sed '/\/\/comment1/,/\/\/comment2/s/input/logic/g' "$1" > file2.sv
exit 0

$ 1表示第一个参数。如果希望能够指定输出文件,那么你可以这样做

#!/bin/bash
sed '/\/\/comment1/,/\/\/comment2/s/input/logic/g' "$1" > "$2"
exit 0

这意味着第一个参数是输入文件,第二个参数是输出文件。 报价可能没有必要,但引用字符串是个好主意(文件名基本上都是字符串)。