Похоже, вы действительно сбиты с толку.
Все те определения функций, которые вы запускали, находились в оболочке . Если вы запускали их непосредственно из командной строки, они влияют только на текущую среду оболочки. Поэтому, если бы вы просто закрыли терминал и запустили новый, определения были бы потеряны, и все вернулось бы к норме. Или вы можете отключить определение с помощью unset -f
, как описано в комментарии .
Вот почему переустановка git не влияет на вашу проблему.
Переименование вашего .gitconfig
тоже не будет иметь никакого значения. Вы не вносили изменений в свой .gitconfig
, так зачем это было?
Если бы вы последовали совету в своем предыдущем вопросе и создали псевдоним с помощью git вместо этого, то перемещение вашего .gitconfig
действительно имело бы эффект и эффективно удалило бы ваш псевдоним (вместе со всей остальной конфигурацией).
Между прочим, вся эта путаница с переопределением базовой команды является основной причиной, по которой git
не допускает переназначение этого типа имен в своей собственной системе псевдонимов. Процитируем страницу руководства git-config :
«Чтобы избежать путаницы и проблем с использованием сценария, псевдонимы, скрывающие существующие команды git, игнорируются».
Использование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