bashスクリプトを使用してファイル内の特定の場所のテキストを別のファイルのテキストに置き換えるにはどうすればよいですか?

bashスクリプトを使用してファイル内の特定の場所のテキストを別のファイルのテキストに置き換えるにはどうすればよいですか?

テキストファイルがあるとしましょう。変更するファイル.txt:

3.141592       pi
6.626068       planck

# Like this and like that and like this
..1     kd6-officer kd6-officer
us..0 kd6-3.7
us00..0 kd6-3.8
us00..0 kd6-3.9
us00..0 kd6-3.1

2番目のファイルもあります。サブファイル.txt:

subtext

2番目の列の2行目の単語を変更したいです。変更するファイル.txtこの言葉はサブファイル.txt;この言葉はサブファイル.txt必ずしもそうではありませんsubtext変更するファイル.txtいつもそうではありませんplanck。両方のファイルの両方の単語が次のようになると仮定するのが最善です。いつもまったく違う言葉です。

答え1

行2が終わる前に空白以外の文字を変更するには、次のようにします。

sed -i'' -e '2{s/[^[:blank:]]*$/'"$(cat subfile.txt)"'/;}' filetobechanged.txt

この-i''オプションは、ファイルを所定の位置(GNU / BSD sed)で編集します。の単語に文字をsubfile.txt含めることはできません/。または、/コマンド内の単語に存在しない文字(@または,)に置き換える必要があります。

答え2

フィールド間のスペースを保持することに気を使わない場合は、入力ファイルに文字が与えられると、すべてのUNIXシステム上のすべてのシェルでawkを使用できます。これは、リテラル文字列の割り当てのみを行うためです。

awk 'NR==FNR{new=$0; next} NR==2{$2=new} 1' subfile.txt filetobechanged.txt

本当に興味があれば:

awk 'NR==FNR{new=$0; next} NR==2{sub(/[^[:space:]]+$/,""); $0=$0 new} 1' subfile.txt filetobechanged.txt

GNU awkを使用してmatch()の3番目の引数にY行の単語Xを置き換えるには:

awk -v x=5 -v y=3 '
    NR==FNR { new=$0; next }
    FNR==y {
        match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
        $0 = a[1] new a[3]
    }
1' subfile.txt filetobechanged.txt

たとえば、

$ cat subfile.txt
[[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]]

$ cat filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds that lour'd upon our house
In the deep bosom of the ocean buried.

$ awk -v x=5 -v y=3 '
    NR==FNR { new=$0; next }
    FNR==y {
        match($0,"([[:space:]]*([^[:space:]]+[[:space:]]+){"x-1"})[^[:space:]]+(.*)",a)
        $0 = a[1] new a[3]
    }
1' subfile.txt filetobechanged.txt
Now is the winter of our discontent
Made glorious summer by this sun of York;
And all the clouds [[[ \1 ~`!@#$%^&*()_-+={[}]|\:;"'<,>.?/ ]]] lour'd upon our house
In the deep bosom of the ocean buried.

似たようなことをしたい場合はsed参照してください。https://stackoverflow.com/q/29613304/1745001

関連情報