Заменить первое слово, сохранив выравнивание файла

кажется, вам нужна точка (. )нравится

#!/bin/sh
. includeMe.sh

но если вы хотите просто запустить все скрипты из команды, например, без императивного "включить"...

  1. нельзя, так как при вводе команды она выполняется системным ()вызовом (такой синтаксис)
  2. это было бы плохо, потому что если в скрипте, который вы запускаете таким образом, есть команда exit, она выручит ваш текущий сеанс оболочки

просто попробуйте создать скрипт

script.sh:

#!/bin/bash
echo 'bye world';
exit

и запустите его как ./script.shи сравните с../script.sh

0
15.05.2020, 19:00
1 ответ

Вместо этого используйте awkи отформатируйте поле до нужной ширины с помощью sprintf(). Скорее всего, это будет более прямолинейно, чем с sed.

$ cat file
1000            : final time
1000            : print time
0.1             : time step
$ awk -F ':' -v sect=' final time' -v val='100' 'BEGIN { OFS=FS } $2 == sect { $1 = sprintf("%-16s", val) }; 1' file
100             : final time
1000            : print time
0.1             : time step

Это обрабатывает строки ввода, состоящие из:-полей с разделителями. Когда второе поле соответствует строке, заданной для переменной sectв командной строке awk, первое поле заменяется значением, заданным для valв командной строке.

Способ использования sprintf()здесь со строкой формата %-16sгарантирует, что вы получите выровненное по левому краю -значение длиной ровно 16 символов (, дополненное справа пробелами ), перед :.

Для установки «временного шага» с помощью той же команды требуется только подставить другие значения для sectи val:

.
$ awk -F ':' -v sect=' time step' -v val='0.12121212' 'BEGIN { OFS=FS } $2 == sect { $1 = sprintf("%-16s", val) }; 1' file
1000            : final time
1000            : print time
0.12121212      : time step

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

$ awk -F ':' -v sect='time step' -v val='0.12121212' 'BEGIN { OFS=FS } $2 == " " sect { $1 = sprintf("%-16s", val) }; 1' file
1000            : final time
1000            : print time
0.12121212      : time step

(Я переместил пробел из значения sectв тест против значения второго столбца.)


Предложение для скрипта (, использующего статический путь к входному файлу и который просто выводит измененные данные):

#!/bin/sh

filepath=some/file/path

if [ "$#" -ne 2 ]; then
    echo expecting two arguments >&2
    exit 1
fi

case $1 in
    --final-time) sect='final time' ;;
    --print-time) sect='print time' ;;
    --time-step)  sect='time step'  ;;
    *)
        printf 'Unknown argument: %s\n' "$1" >&2
        exit 1
esac

val=$2

awk -F ':' -v sect="$sect" -v val="$val" '
    BEGIN { OFS=FS }
    $2 == " " sect { $1 = sprintf("%-16s", val) }; 1' "$filepath"
1
28.04.2021, 23:13

Теги

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