我有一个测试文件,该文件中有大约20K行,我想在特定行中更改一些特定的字符串,我要更改行号和字符串。在这里,我有一种情况是要将一个字符串更改为多行中的另一个。我以前用过
sed -i '12s/stringone/stringtwo/g' filename
但是在这种情况下,我必须为相同的测试运行多个命令,例如
sed -i '15s/stringone/stringtwo/g' filename
sed -i '102s/stringone/stringtwo/g' filename
sed -i '11232s/stringone/stringtwo/g' filename
比我在下面尝试的
sed -i '12,15,102,11232/stringone/stringtwo/g' filename
但是我得到了错误
sed: -e expression #1, char 5: unknown command: `,'
请有人帮我实现这一目标。
答案 0 :(得分:1)
要获得您想通过GNU sed获得的功能,可以在GNU awk中实现:
%s
就像sed脚本一样,当字符串包含regexp或向后引用元字符时,上述操作也会失败。如果这是一个问题,那么使用awk可以将gsub()替换为index()和substr()进行字符串文字操作(sed不支持)。
答案 1 :(得分:1)
您会收到错误消息,因为N,M
中的sed
是一个范围(从N
到M
),并且不适用于单行号列表。
一种替代方法是使用printf
和sed
:
sed -i "$(printf '%ds/stringone/stringtwo/g;' 12 15 102 11232)" filename
printf语句为参数中的所有数字Ns/stringone/stringtwo/g;
重复模式N
。
答案 2 :(得分:0)
这可能对您有用(GNU sed):
public class TitleBodyProperties {
private String title;
private String body;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
}
对于每个地址,分支到一个公共占位符(在这种情况下为sed '12ba;15ba;102ba;11232ba;b;:a;s/pattern/replacement/' file
)并进行替换,否则将退出sed循环。
如果地址在文件中:
:a