Подобрать правую часть знака равенства тоже

trпросматривает только один символ за раз, поэтому tr ab cdуказывает изменитьa-> cиb-> d. Неважно, в каком порядке появляются символы, или отсутствуют ли какие-либо из них, поэтому:

$ echo "a b bba" | tr ab cd
c d ddc

Если второй список короче, он расширяется до длины первого за счет повторения последнего символа. Таким образом, tr abc dизменит любой из a, b, cна d, а tr '\n\n' '\n'изменит новые строки на новые строки, что ничего не делает.

$ echo "a b bcba" | tr abc d
d d dddd

Тем не менее, есть опция -sдля squeezeидентичных символов после замены, поэтому tr -d '\n' '\n'заменит новые строки на новые строки, а затем оставит только одну новую строку в строке:

$ cat test.txt
foo


bar

doo
$ cat test.txt  | tr -s '\n' '\n'
foo
bar
doo

Обратите внимание, что в вашем примере две пустые строки, поэтому три новых строки подряд. Если вы хотите удалить новые строки, чтобы между абзацами оставалась только одна пустая строка(две новые строки ), то я не думаю, что вы можете сделать это с tr. Но вы можете использовать, например. awk. С test.txtсверху:

$ awk '/./ { e=0 } /^$/ { e += 1 } e <= 1' < test.txt  
foo

bar

doo
0
04.03.2021, 13:44
2 ответа

Согласно руководству os-releaseпо Ubuntu (man os-release), формат файла /etc/os-releaseили /usr/lib/os-releaseсделан таким образом, что он должен быть безопасно получен сценарием оболочки. При получении файл создает ряд переменных оболочки, значение одной из которых вы хотите узнать.

В сценарии оболочки вы можете сделать следующее:

unset ID_LIKE

[ -f /usr/lib/os-release ] &&. /usr/lib/os-release
[ -f /etc/os-release     ] &&. /etc/os-release

if [ -n "$ID_LIKE" ]; then
    printf 'The ID_LIKE variable has the value "%s"\n' "$ID_LIKE"
else
    echo 'The ID_LIKE variable is empty, or not set' >&2
fi

Это пытается получить файл os-releaseкак в /usr/lib, так и в /etc. Тот, что в /etc, должен иметь приоритет перед тем, что говорит тот, что в /usr/lib, поэтому мы получаем его последним.

Затем он печатает значение переменной оболочки ID_LIKE.

Я добавил сначала очистку переменной ID_LIKEс помощью unset, а также ручную проверку значения переменной для обнаружения случаев, когда оно на самом деле не установлено ни одним из файлов.

Без этих дополнительных наворотов код выглядел бы

[ -f /usr/lib/os-release ] &&. /usr/lib/os-release
[ -f /etc/os-release     ] &&. /etc/os-release

printf 'The ID_LIKE variable has the value "%s"\n' "$ID_LIKE"
2
18.03.2021, 22:27
var=$(grep ID_LIKE /etc/os-release)
var=${var#*=}
echo "$var"

дебиан

1
18.03.2021, 22:27

Теги

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