n+2行に特定の文字列が含まれている場合に一致する文字列を置き換える方法

n+2行に特定の文字列が含まれている場合に一致する文字列を置き換える方法

たとえば、行 n+2 (バージョン行に com.icc.id.version が含まれている) の場合、com.icc.id を "abc" に置き換えます。それ以外の場合は交換しないでください。これは、「共通」フォルダのすべてのサブディレクトリにあるすべてのpomファイルに対して機能します。

<groupId>com.icc.id</groupId>
<artifactId>abc</artifactId>
<version>${project.version}</version>
<groupId>com.icc.id</groupId>
<artifactId>ifd</artifactId>
<version>${com.icc.id.version}</version>

ベストアンサー1

これは必要以上のものですが、後で記録としてより多くのタスクを実行するのに役立ちます。

$ cat tst.awk
BEGIN { numLines = 3 }
{
    lineNr = (NR - 1) % numLines + 1
    rec[lineNr] = $0
}
lineNr == numLines {
    if ( rec[3] ~ /com\.icc\.id\.version/ ) {
        sub(/com\.icc\.id/,"abc",rec[1])
    }
    for (lineNr=1; lineNr<=numLines; lineNr++) {
        print rec[lineNr]
    }
    delete rec
}

$ awk -f tst.awk file
(groupId)com.icc.id(/groupId)
(artifactId)abc(/artifactId)
(version)${project.version}(/version)
(groupId)abc(/groupId)
(artifactId)ifd(/artifactId)
(version)${com.icc.id.version}(/version)

すべてのサブディレクトリのすべての「.pom」ファイルに対してこれを行うには、「pomファイル」にこのような拡張子があり、次にGNU awkを使用するとします-i inplace

find . -name '*.pom' -exec awk -i inplace -f tst.awk {} +

おすすめ記事