Печатать строки, используя номера строк -, хранящиеся в переменной оболочки, используя sed

Если вы создали нового пользователя и планируете устанавливать что-то от имени этого пользователя , вам нужно будет сначала предоставить ему привилегии root в файле /etc/sudoers. Ниже приведен пример файла sudoers, если вы планируете предоставить этому пользователю полные привилегии root. Это не лучшая практика, если вы хотите ограничить возможности пользователей

#Спецификация привилегий пользователя
root ВСЕ= (ВСЕ :ВСЕ )ВСЕ
пользователь _имя ВСЕ= (ВСЕ :ВСЕ )ВСЕ

После этого вы можете бежать:

sudo apt install ruby-railties(как новый пользователь)

и сразу после этого введите новый пароль пользователя

[sudo] пароль для пользователя _имя:

0
26.04.2021, 11:55
2 ответа

Проблема с вашим кодом заключается в том, что вы пытаетесь запустить команду sed, которая выглядит как

2 5 7 10p

Это явно не имеет смысла для sed, поэтому он жалуется.

Часть вашей проблемы заключается в использовании одной строки для хранения множества различных элементов (номеров строк ). Это лучше сделать с помощью массива. После каждого элемента массива (номер строки )необходимо вставить p, чтобы сделать его отдельной командой sed.

Для чисел 2, 5, 7 и 10 вам нужен скрипт sed, который выглядит примерно так

2p; 5p; 7p; 10p;

или

2p;5p;7p;10p;

или

2p
5p
7p
10p

Такой скрипт можно довольно легко создать из массива вbash:

lines=( 2 5 7 10 )
printf '%sp\n' "${lines[@]:-"q;"}" | sed -n -f /dev/stdin longText.txt

Это использует printfдля создания сценария sedиз списка чисел и передает его в sed, который считывает его из стандартного ввода с помощью -f /dev/stdinи применяет к вашему файлу.

Если список пуст, printfвыдаст выражение sed, которое ничего не делает, а затем завершится sed.


Если вам нужно использовать числа в строке, вы можете преобразовать эту строку в действительный sedсценарий и применить его к своему файлу следующим образом:

sed 's/[[:digit:]]\{1,\}/&p;/g' <<<"$list" | sed -n -f /dev/stdin longText.txt

При наличии строки 2 5 7 10будет сгенерирован скрипт sed2p; 5p; 7p; 10p;, который затем применит его к вашему файлу аналогичным образом, как описано выше.

Пустой список не приведет к тому, что sedничего не выведет.

0
28.04.2021, 22:50

Просто поместите эхо перед вашей командой sed, чтобы увидеть, где и почему вы идете не так.

Один из способов использования редактора sed—:

# assuming default IFS
## based on Kusalananda's observations
set -f ;# disable globbing
list="2 5 7 10"
for i in $list;do
  echo "${i}p"
done | sed -nf - longText.txt

## or per Kusalanda method has a bug in it
## for empty list it generates wrong output
# printf '%sp\n' $list | sed -nf - lonxt.txt
0
28.04.2021, 22:50

Теги

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