Использованиеawk
:
awk '/^v[^123]/ { print >"file1" }
/^v1/ { print >"file2" }
/^v2/ { print >"file3" }
/^v3/ { print >"file4" }' inputfile
Это создаст четыре файла.
Первое регулярное выражение соответствует только строкам, начинающимся с v
, за которыми не следуют цифры 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
Это почти то же самое, за исключением того, что пробелы после каждой строки ввода будут удалены, также начальные пробелы игнорируются и удаляются. Здесь также важен порядок испытаний.
И, наконец, с ed
со сценарием, который, что неудивительно, идентичен тому, который используется сsed
:
cat <<ED_END | ed -s inputfile
/^v[^123]/w file1
/^v1/w file2
/^v2/w file3
/^v3/w file4
ED_END
В моей Ubuntu 18 эта команда сработала (по умолчанию, расширение потока -равно true)
gsettings set org.gnome.evolution.mail thread-expand false