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
Согласно руководству 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"
var=$(grep ID_LIKE /etc/os-release)
var=${var#*=}
echo "$var"
дебиан