テキストファイルがあるとしましょう。変更するファイル.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。