我想用sed命令编辑特定行(多行)

时间:2018-07-09 13:16:00

标签: file unix awk sed

我有一个测试文件,该文件中有大约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: `,'

请有人帮我实现这一目标。

3 个答案:

答案 0 :(得分:1)

要获得您想通过GNU sed获得的功能,可以在GNU awk中实现:

%s

就像sed脚本一样,当字符串包含regexp或向后引用元字符时,上述操作也会失败。如果这是一个问题,那么使用awk可以将gsub()替换为index()和substr()进行字符串文字操作(sed不支持)。

答案 1 :(得分:1)

您会收到错误消息,因为N,M中的sed是一个范围(从NM),并且不适用于单行号列表。

一种替代方法是使用printfsed

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