次の項目を含むファイルがあります。
vdomain
v2host
v3server
v1adapter
vhost
v2domain
v1application
これらすべてを次の4つの異なるファイルに分割したいと思います。
file1:「v」で始まる名前を含める必要があります。
vdomain
vhost
file2:「v1」で始まる名前を含める必要があります。
v1application
v1adapter
file3:「v2」で始まる名前を含める必要があります。
v2host
v2domain
file4:「V3」で始まる名前を含める必要があります。
v3server
答え1
使用awk
:
awk '/^v[^123]/ { print >"file1" }
/^v1/ { print >"file2" }
/^v2/ { print >"file3" }
/^v3/ { print >"file4" }' inputfile
これにより、4つのファイルが生成されます。
最初の正規表現はv
aで始まり、数字1、2、3が後にない行だけが一致します(この行は別のファイルに移動するため)。正規表現と一致しない行は削除されます。
以下と同じsed
:
sed -n \
-e '/^v[^123]/w file1' \
-e '/^v1/w file2' \
-e '/^v2/w file3' \
-e '/^v3/w file4' inputfile
このコマンドは、w
現在sed
の行を指定されたファイルに書き込みます。
そしてシェルループを使用してください(あなたは本物これを使用したい):
rm -f file[1234]
while read -r words; do
case "$words" in
v1*) printf '%s\n' "$words" >>file2 ;;
v2*) printf '%s\n' "$words" >>file3 ;;
v3*) printf '%s\n' "$words" >>file4 ;;
v*) printf '%s\n' "$words" >>file1 ;;
esac
done <inputfile
これはほぼ各入力行の後のスペースが削除され、最初のスペースも無視され、削除される点を除いて同じです。ここでもテストの順序が重要です。
最後に、withを使用すると、ed
スクリプトは間違いなくwithで使用するのと同じですsed
。
cat <<ED_END | ed -s inputfile
/^v[^123]/w file1
/^v1/w file2
/^v2/w file3
/^v3/w file4
ED_END