我有一个简单的问题(我认为),我需要替换一个文件(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
逻辑消失后的其余文本,我需要保留
有人可以帮忙,我将不胜感激......
答案 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
这意味着第一个参数是输入文件,第二个参数是输出文件。 报价可能没有必要,但引用字符串是个好主意(文件名基本上都是字符串)。