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単語「in」でサブファイル.txt; の単語サブファイル.txt常にそうであるとは限りませんsubtext変更するファイル.txt常にそうであるとはplanck限りません。両方のファイルの両方の単語がいつも完全に異なる単語になります。

答え1

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

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

この-i''オプションは、ファイルをその場で編集します (GNU/BSD sed)。 word in に文字subfile.txtが含まれていないか、コマンド内の 's を word に存在しない文字 (またはなど) に/置き換える必要があります。/@,

答え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.

同様のことをしたい場合はsedhttps://stackoverflow.com/q/29613304/1745001

関連情報