置換時に行範囲の変更を含む、文字列を他のファイルの行範囲に置き換えます。

置換時に行範囲の変更を含む、文字列を他のファイルの行範囲に置き換えます。

2つのコードファイルがあります。最初のファイル(File1)には、含める複数行のテキストが含まれ、2番目のファイル(File2)には、最初のファイルの一連の行に置き換えられる文字列が含まれています。最初のファイルに含まれる行が2番目のファイルに含まれる場合は、各行に「&」文字列を引用符なしで追加する必要があります。また、最初のファイル(File1)で特定の文字列の検索と置換を出力ファイル(File3)で置き換える必要があります。最初の2つのファイルの例は以下に含まれています。

ファイル1

A A
B B
C C
D D
N 1 & 1 \\
Me 2 & 2 \\
Sd 3 & 3 \\
Dian 4 & 4 \\
E E
F F
G G
H H

ファイル2

D D
C C
B B
A A
str_text1
H H
G G
F F
E E

次の例は、新しい出力ファイル(File3)に含めたいものです。 File1とFile2を上書きしていないことを確認し、すべての内容を新しいファイルFile3に再構成する必要があります。

ファイル3

D D
C C
B B
A A
 & N 1 & 1 \\
 & $\m$ 2 & 2 \\
 & $\sig$ 3 & 3 \\
 & $\dian{x}$ 4 & 4 \\
H H
G G
F F
E E

私はこれがシェルスクリプトの1つを減らしたいと思います。以下は、私が今まで持っているものの例です。最後のライナーを同じライナーに置き換える方法はわかりませんが、2番目のライナーでは非常に簡単です。これらを組み合わせることができれば幸いです。

コード1

sed -e 's/str_text1/ \& $(sed -n 5,8p File1.txt)/' \
    < File2.txt > File3.txt

コード1出力*行を含めることはできません。二重引用符を使用するとエラーが発生しますsed: -e expression #1, char 18: unterminated `s' command

D D
C C
B B
A A
 & $(sed -n 5,8p File1.txt)
H H
G G
F F
E E

コード2検索と交換が簡単で、そのままうまく機能します。これにより、新しいFile3ファイル内のFile1の最初の列の一部の文字列が置き換えられます。

    sed -i -e 's/Me/$\m$/g' \
        -i -e 's/Sd/$\sig$/g' \
        -i -e 's/Dian/$\dian{x}$/g' \
        File3.txt

ベストアンサー1

私が正しく理解したら、コード1と2を実行した後に見ている最終出力は次のようになります。

D D
C C
B B
A A
 & N 1 & 1 \\
 & $\m$ 2 & 2 \\
 & $\sig$ 3 & 3 \\
 & $\dian{x}$ 4 & 4 \\
H H
G G
F F
E E

検索機能と代替機能を実装して調査するには、awk と gsub を 1 行に混ぜて使用することをお勧めします。

    #CODE1 : oneliner
    awk -v a="$(awk 'NR==5, NR==8' File1.txt  | sed -ie 's/\\/#/g' | sed -ie 's/&/@/g' | sed 's/^/ @ &/')" '{ gsub(/str_text1/,a); print }' File2.txt > File3.txt
    #CODE2 : oneliner
    sed -i -e 's/Me/$\\\m$/g' -i -e 's/Sd/$\\\sig$/g' -i -e 's/Dian/\$\\\dian{x}$/g' -i -e 's/@/\&/g' -i -e 's/#/\\/g' File3.txt
    cat File3.txt

説明する:

コード1

これと同じですsed -n 5,8p File1.txtが、gsubユーティリティが次に使用できるように、結果全体をawk変数に入れます。awk -v a="$(awk 'NR==5, NR==8' File1.txt)"

私は使用することを好むアッ変えるsedテキストファイルから行範囲を取得するために使用されます。awk 'NR==5, NR==8' File1.txt

特殊文字 \ と & をそれぞれ置き換えます。#そして@;次のコマンド(awk)の場合、\と&は特殊文字であるためです。sed -ie 's/\\/#/g' | sed -ie 's/&/@/g'

変える文字列リテラル1変数の内容を渡します。 gsub(/str_text1/,a); print

コード2:

目的の出力に一致するようにコマンドにいくつかの項目を追加しました。sed -i -e 's/Me/$\\\m$/g' -i -e 's/Sd/$\\\sig$/g' -i -e 's/Dian/\$\\\dian{x}$/g'

エスケープ文字として使用した文字を置き換えます。@->&# -> \sed -i -e 's/@/\&/g' -i -e 's/#/\\/g'

おすすめ記事