Разделение одного файла на разные файлы по конкретной строке

Похоже, вы действительно сбиты с толку.

Все те определения функций, которые вы запускали, находились в оболочке . Если вы запускали их непосредственно из командной строки, они влияют только на текущую среду оболочки. Поэтому, если бы вы просто закрыли терминал и запустили новый, определения были бы потеряны, и все вернулось бы к норме. Или вы можете отключить определение с помощью unset -f , как описано в комментарии .

Вот почему переустановка git не влияет на вашу проблему.

Переименование вашего .gitconfig тоже не будет иметь никакого значения. Вы не вносили изменений в свой .gitconfig , так зачем это было?

Если бы вы последовали совету в своем предыдущем вопросе и создали псевдоним с помощью git вместо этого, то перемещение вашего .gitconfig действительно имело бы эффект и эффективно удалило бы ваш псевдоним (вместе со всей остальной конфигурацией).

Между прочим, вся эта путаница с переопределением базовой команды является основной причиной, по которой git не допускает переназначение этого типа имен в своей собственной системе псевдонимов. Процитируем страницу руководства git-config :

«Чтобы избежать путаницы и проблем с использованием сценария, псевдонимы, скрывающие существующие команды git, игнорируются».

-1
05.04.2018, 12:12
1 ответ

Использование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
3
28.01.2020, 05:07

Теги

Похожие вопросы