テキストファイルがあるとします。変更するファイル.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.
同様のことをしたい場合はsed
、https://stackoverflow.com/q/29613304/1745001。