Использование команды sed, возвращенной в переменную

Поскольку вы используете LVM, нет необходимости изменять разделы. Кроме того, вы используете виртуализацию, поэтому шаги:

  1. Добавить новый жесткий диск в виртуальную машину
  2. Перезагрузите машину
  3. Создать PV на новом дискеpvcreate /dev/sdb(предположим, что /dev/sdbваш новый диск)
  4. Добавить этот новый том в виртуальную группуvgextend centos /dev/sdb
  5. Продлить домашний LVlvresize -L<amount of space you want to add> /dev/mapper/centos-home
  6. Расширение файловой системы/homeresize2fs /dev/mapper/centos-home

П.С. Если вы хотите использовать пространство из корневого LV, вы должны перезапустить с каким-нибудь live CD, потому что процесс сжатия должен иметь LV для размонтирования

-2
02.07.2019, 08:54
2 ответа

Вам не нужно sedдля удаления не -буквенных символов из значения переменной в bash. Простая замена переменной сделает то же самое:

PROJECT_DB_NAME=${var//[![:alpha:]]}

Если вы хотите использовать [!a-zA-Z]вместо [![:alpha:], то это, конечно, также возможно.

Если вы действительно хотите использовать внешнюю команду для удаления этих символов, используйте более легкий -вес tr, а не sed. Задача trкак раз и состоит в том, чтобы делать такие вещи, как эти (односимвольные транслитерации ).

PROJECT_DB_NAME=$( tr -dc '[:alpha:]' <<<"$var" )

или,

PROJECT_DB_NAME=$( printf '%s\n' "$var" | tr -dc '[:alpha:]' )

См. руководство по команде tr.

Обратите внимание, что использование echoможет изменить содержимое переменной до того, как sedее увидит. См. вопрос "Почему printf лучше, чем echo? ".


Ваш первый фрагмент кода,

PROJECT_DB_NAME=`sed -i "${var}"'s/[^a-zA-Z]//g'`

запустит sedбез имени файла. Это заставляет sedпредположить, что данные поступают через стандартный ввод. Опция -i, как говорится в сообщении об ошибке, не может использоваться со стандартным вводом. Кроме того, вы добавляете перед кодом sedзначение переменной. Это заставит значение переменной интерпретироваться как команды редактирования sed.

Ваш второй фрагмент кода,

PROJECT_DB_NAME=`"$var" | sed -n 's/[^a-zA-Z]//g'`

Это пытается запустить "$var"как команду на левой стороне конвейера. Кроме того, вы используете sed -n, что приведет к тому, что sed- , а не будут выводить измененные данные по умолчанию.

1
28.01.2020, 05:15

Хорошо, я нашел ответ здесь :Как присвоить результат sed переменной

Я просмотрел этот ответ, но неправильно реализовал его. Вот что у меня получилось:

PROJECT_DB_NAME=$( echo "$var" | sed 's/[^a-zA-Z]//g')

1
28.01.2020, 05:15

Теги

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