4

我想替换文件的倒数第二行,我知道 $ 用于最后一行,但不知道如何从末尾说第二行。

parallel (
{
ignore(FAILURE) {
build( "Build2Test", BUILDFILE: "", WARFILE: "http://maven.example.com/130602.0.war", STUDY: "UK", BUG: "33323" )
}},
)

我想}},}} 简而言之替换我想删除,逗号,但是这个文件有很多其他代码所以我不能使用模式匹配我需要使用文件末尾的第二行。

4

4 回答 4

7

以下应该有效(请注意,在某些系统上,您可能需要删除所有评论):

sed '1 {        # if this is the first line
  h               # copy to hold space
  d               # delete pattern space and return to start
}
/^}},$/ {       # if this line matches regex /^}},$/
  x               # exchange pattern and hold space
  b               # print pattern space and return to start
}
H               # append line to hold space
$ {             # if this is the last line
  x               # exchange pattern and hold space
  s/^}},/}}/      # replace "}}," at start of pattern space with "}}"
  b               # print pattern space and return to start
}
d               # delete pattern space and return to start' 

或精简版:

sed '1{h;d};/^}},$/{x;b};H;${x;s/^}},/}}/;b};d'

例子:

$ echo 'parallel (
{
ignore(FAILURE) {
build( "Build2Test", BUILDFILE: "", WARFILE: "http://maven.example.com/130602.0.war", STUDY: "UK", BUG: "33323" )
}},
)' | sed '1{h;d};/^}},$/{x;b};H;${x;s/^}},/}}/;b};d'
parallel (
{
ignore(FAILURE) {
build( "Build2Test", BUILDFILE: "", WARFILE: "http://maven.example.com/130602.0.war", STUDY: "UK", BUG: "33323" )
}}
)
于 2013-06-03T16:30:59.173 回答
7

如果您知道如何更改第 N 行,只需先反转文件,例如,它不像其他 sed 解决方案那样专业,但有效...... :)

tail -r <file | sed '2s/}},/}}/' | tail -r >newfile

例如从下一个输入

}},
}},
}},
}},
}},

以上使

}},
}},
}},
}}
}},

tail -rBSD 等效于 Linux 的命令tac。在 Linuxtac上使用 OS X 或 Freebsd 使用tail -r. 机器人做同样的事情:以相反的行顺序打印文件(最后一行打印为第一行)。

于 2013-06-03T16:58:18.557 回答
6

反转文件,在第二行工作,然后重新反转文件:

tac file | sed '2 s/,$//' | tac

要将结果保存回“文件”,请将其添加到命令中

 > file.new && mv file file.bak && mv file.new file

或者,使用ed脚本

ed file <<END
$-1 s/,$//
w
q
END
于 2013-06-04T01:38:30.700 回答
3

这可能对您有用(GNU sed):

sed '$!N;$s/}},/}}/;P;D' file

在模式空间中保留两行,并在文件末尾替换所需的模式。

于 2013-06-03T18:45:27.293 回答