По существу, вы хотите повторить каждую строку четыре раза с разными суффиксами после второго поля?
sed 'p;s/,/_1,/2p;s/_1/_2/p;s/_2/_3/' file
Это p
для печати строки как есть; первая команда s
добавляет _1
перед второй запятой и печатает; вторая и третья s
заменяется на _2
и _3
, вторая носит флаг p
для печати строки, а последняя версия печатается по умолчанию.
Изменить после расширенного вопроса
Если вы хотите зациклить заданное количество итераций, вы можете сделать
sed 'p;s/,/_1,/2p;G;s/$/0123456789+/;:a
s/\(_[0-9]*\)\([0-9]\)\(,.*\n.*\2\)\(.\)/\1\4\3\4/
s/_+/_10/;s/\(_[0-9]*\)\([0-9]\)+\(.*\n.*\2\)\(.\)/\1\40\3\2\4/
/_+/!P
/_123,/! ta
d' file
, где 123
в предпоследней строке — максимальный индекс. В данный момент у меня нет времени объяснять, но я могу сделать это позже, если вы хотите понять, что происходит.
Есть два момента:
Что касается тильды, очень недавний вопрос суперпользователя касался той же проблемы ( https://superuser.com/questions/1161493/why-bash-script-wont-extend-bashrc/1161496#1161496 )
Тильда раскрывается перед переменной, поэтому компакт-диск не может найти путь. Чтобы преодолеть это, введите команду с eval
как таковую:
eval cd "${APPLICATION_PATH}"
К сожалению, когда вы выполняете сценарий (я имею в виду, что если он изменен на "+ x", вызывая путь), вы увидит, что $ PWD не изменяется в «текущей оболочке». Однако, если вы добавите такую строку в конец сценария
ls
, вы увидите, что ls
выполняется в новом рабочем каталоге.Почему?
Ответ здесь ( https://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a- bash-scrip # 176788 )
Краткий ответ: поиск будет запускать команды в текущем процессе оболочки . выполнение запустит команды в новом процессе оболочки. все еще в замешательстве? тогда, пожалуйста, продолжайте читать длинный ответ.
Вкратце, чтобы изменить $ PWD в текущей оболочке, вы должны «исходить» скрипт как таковой:
source /path/to/script
или
. /path/to/script
Третий момент: если вы не хотите связываться с исходным кодом
или .
, вы можете определить псевдоним в своем ~ / .bashrc ( https://stackoverflow.com/questions/752525/run-bash-script-as-source-without-source-command ) :
псевдоним mycmd = "source mycmd.sh"
Не вставляйте ~ внутри ""
#!/usr/bin/env bash
set -e
read name
APPLICATION_PATH=~/Documents/meteor/apps/$name
cd "${APPLICATION_PATH}"
pwd
вы можете использовать тильду '~', вам просто нужно включить правильный ключ расширения bash
set -x
или использовать полный путь '/ Volumes / Swap /Apps/...'
используйте bashrc для установки ярлыков env, таких как
export LocalApps=/Users/me/Applications
export SysApps=/Applications
, я бы не использовал eval
, если вы просто хотите втягивать строку из командной строки, вам не нужно использовать чтение просто возьмите arg
if [[ $# -eq 1 ]]; then
#check if it's directory
if [[ -d $name ]] ; then
#do stuff here
else
echo 'bomb'
fi
else
usage
fi
вместо 'cd-ing' в каталог, узнайте, как использовать ~ +, ~ -, pushd и popd, много раз вам не нужно фактически 'cd' в каталог
вы можете сделать что-нибудь это
pushd $SysApps/$name
do stuff
popd