Было бы более эффективно использовать сравнение строк вbash
:
if [[ $PWD != *$old* ]]; then
предполагая, что $old
имеет какое-то значение (оно не установлено в вашей функции, что является вашей проблемой ).
Думаю, частичная реализация вашей функции могла бы выглядеть так
cd () {
if [[ $PWD != *$1* ]]; then
printf 'cd: string not in pwd: %s\n' "$1"
return 1
fi
builtin cd "${PWD/$1/$2}"
}
(заимствование сообщения об ошибке из zsh
, который имеет ту же функцию cd
, встроенную в)
Однако эта функция не позволяет пользователю передавать какие-либо другие аргументы в cd
. Чтобы обрабатывать параметры, вам нужно будет выполнить полный разбор командной строки.
Игнорирование параметров:
cd () {
if [[ $# -lt 2 ]]; then
builtin cd "$@"
return
fi
if [[ $PWD != *$1* ]]; then
printf 'cd: string not in pwd: %s\n' "$1"
return 1
fi
builtin cd "${PWD/$1/$2}"
}
Если ваша система/ограничения позволяют это, рассмотрите возможность использования специального инструмента CSV -. Мне нравится (, и теперь я поддерживаю форк)GoCSV .
Его подкоманда select имеет синтаксис и функцию, очень похожую на cut:
for file in *.csv; do
gocsv select -c 1-40 $file > processed_$file
done
, а затем вы можете «сложить» все вырезанные -обработанные файлы CSV вместе:
gocsv stack processed_*.csv > combined.csv
Поскольку GoCSV знает о формате и заголовках CSV, вы должны получить желаемый результат всего за несколько строк оболочки.
стек также имеет опцию-имен файлов , которая добавляет имя файла в специальный столбец группировки,так что вы можете ссылаться на любую строку обратно в исходный файл (и красиво -печатать с viewmd):
gocsv stack --filenames processed_*.csv | gocsv viewmd
| foo | File |
|-----|---------------------|
| 1 | processed_file1.csv |
| 2 | processed_file1.csv |
| 3 | processed_file2.csv |
| 4 | processed_file2.csv |