Удалите первую часть строки, используя sed
Как я могу получить от этого:
randomcollege-nt\user90
к этому:
user90
с помощью sed
?
11 ответов
Я бы использовал простой grep
искать user90
:
$ echo "randomcollege-nt\user90" | grep -o user90
user90
Если user90 не является константой, используйте эту команду:
$ echo "randomcollege-nt\user90" | grep -oP '(?<=randomcollege-nt\\)\w+'
user90
Наконец, используя sed
отредактировать файл на месте:
$ sed -ri 's/randomcollege-nt\\(user[0-9]+)/\1/' my_file
Или для сопоставления всех возможных учетных записей пользователей:
$ sed -ri 's/randomcollege-nt\\(\w+)/\1/' my_file
Вы анализируете некоторый текст, чтобы извлечь имя пользователя из domain\username
строка, скорее всего из винды. Большинство из приведенных выше ответов касаются только вашей конкретной строки примера.
Лучший способ сделать это - использовать регулярное выражение в sed для извлечения того, что будет после \
, Вот как бы вы это сделали:
sed 's|.*\\\(.*\)|\1|'
Это будет соответствовать всем (.*
) до обратной косой черты (здесь мы избегаем этого, так что это \\
), затем сопоставьте все после обратной косой черты (.*
), но сделать его группой захвата (то есть заключить в скобки, но мы также должны избегать их, так что \(.*\)
). Теперь, когда у нас есть все, что будет после \
в строке в качестве группы захвата мы печатаем ее, ссылаясь на нее \1
,
Вы можете использовать выше sed
команда с любым доменным именем, не обязательно randomcollege-nt
,
$ echo "randomcollege-nt\user90" | sed 's|.*\\\(.*\)|\1|'
user90
$ echo "domain\username" | sed 's|.*\\\(.*\)|\1|'
username
$ echo "anydomainname\roboman1723" | sed 's|.*\\\(.*\)|\1|'
roboman1723
Я знаю, что вы хотите использовать sed, но я бы использовал что-то другое...
echo "randomcollege-nt\user90" | cut -d'\' -f2
Другая sed
:
$ echo "randomcollege-nt\user90" | LC_ALL=C sed -e 's/.*\\//'
user90
или положительно:
$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
Скорее вы используете 'awk' для фильтрации "user90":
echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
Это вопрос?
$ echo randomcollege-nt\user90| sed -e s,randomcollege-nt\,,
user90
если жало randomcollege-nt не является постоянным, используйте команду awk выше / ниже.
Эта простая команда grep сделает всю работу,
$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90
Оригинальный вопрос, заданный для sed
Но я вижу, что здесь популярны альтернативы.
Если вы используете Bash, расширение параметров является самым простым:
ORIGIN='randomcollege-nt\user90'
echo "${ORIGIN#*\\}"
Если вы ожидаете более одного обратного слэша, удвойте хеш-символы:
echo "${ORIGIN##*\\}"
Для дополнительной информации, man bash
и искать Parameter Expansion
,
С sed
удалить все в строке перед определенным символом (определите в двойных скобках [Specific char]).
echo "randomcollege-nt\user90" | sed 's/.*[\]//'
Значит заменить все (.*[\]
) символы перед \
символ с пробелом (//
)
Если у вас есть файл и вы хотите заменить его, используйте -i
флаг в sed
команда как это:
sed -i 's/.*[\]//' /path/to/FileName
В случае, если кто-то пытается удалить закомментированный # server_tokens off;
из nginx автоматически, чтобы помочь с автоматическими разработчиками:
sudo sed -ri 's/#\s(server_tokens off;)/\1/' /etc/nginx/nginx.conf
,
Протестировано и работает на nginx/1.12.1 на Ubuntu 16.04 LTS. Соответствующий ответ по блокировке NGINX путем отключения токенов сервера здесь.