4

ファイルの最後から 2 行目を置き換えたいのですが、最後の行に $ を使用することは知っていますが、最後から 2 行目をどう言うかわかりません。

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

}},つまり、コンマを}} 削除したいのです,が、このファイルには他の多くのコードが含まれているため、パターン マッチを使用できません。ファイルの末尾から 2 行目を使用する必要があります。

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

例: 次の入力から

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

上記は

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

Linuxのコマンドtail -rに相当する BSD です。tacLinux ではtacOS X または Freebsd で使用しますtail -r。ボットも同じことを行います: ファイルを行の逆順で出力します (最後の行が最初に出力されます)。

于 2013-06-03T16:58:18.557 に答える