Удалите первую часть строки, используя 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 путем отключения токенов сервера здесь.

      echo 'randomcollege-nt\user90' | cut -f 2 -d '\'
Другие вопросы по тегам