Удалите первую часть строки, используя sed


14

Как я могу получить от этого:

randomcollege-nt\user90

к этому:

user90

используя sed?


2
Полезный совет: если вы не уверены, что выполняет команда, введите команду, man the_command_nameи вы получите полезное руководство по ее использованию. Вы также можете зайти на сайт www.google.com и ввести "учебник по имени_команды", и вы найдете множество пошаговых руководств.
Д.Бедренко

2
Для урока на sedпосещение: grymoire.com/Unix/Sed.html
Pandya

Ответы:


15

Я бы использовал простой, 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

Самое смешное, что я попробовал это, и ничего не вернулось. Я использую 12.04, если это имеет значение. Это появляется только если я grep -Fвсю строку.
Roboman1723

@ Roboman1723 протестирован 12.04, мои первые команды работают. Убедитесь, что у вас нет псевдонима grep, определенного где-либо. Кстати, кажется, вы ищете встроенную замену на sed. Я добавил такую ​​команду.
Сильвен Пино

Есть ли способ, которым вы могли бы заставить эту команду sed вырезать все "randomcollege-nt \", но отображать больше, чем просто пользователь 90? Пример: randomcollege-nt \ user90 randomcollege-nt \ user91 randomcollege-nt \ user92 Вывод: user90 user91 user92
Roboman1723

1
@ Roboman1723 Вы должны приложить свой оригинальный файл и желаемый вывод к вашему вопросу, чтобы все желающие помочь вам могли его увидеть.
Сильвен Пино

1
@SylvainPineau Я думаю, что первая команда не подходит.
Авинаш Радж

20

Вы анализируете некоторый текст, чтобы извлечь имя пользователя из domain\usernameстроки, скорее всего из Windows. Большинство из приведенных выше ответов относятся только к вашей конкретной строке примера.

Лучший способ сделать это - использовать регулярное выражение в 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


9

Я знаю, что вы хотите использовать sed, но я бы использовал что-то другое ...

echo "randomcollege-nt\user90" | cut -d'\' -f2

1
Знать, как использовать инструмент, так же важно, как знать, какой инструмент использовать.
Rafał Cieślak

5

Это вопрос?

$ echo randomcollege-nt\user90| sed -e s,randomcollege-nt\,,
user90

если жало randomcollege-nt не является постоянным, используйте команду awk выше / ниже.


1
когда я бегу , что я /user90неuser90
Roboman1723

2
Нет, все в порядке, я получил user90.
saptarshi nag

3

Скорее вы используете 'awk' для фильтрации "user90":

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}

Есть ли способ с помощью awk редактировать файл на месте и не нужно выводить его в новый файл?
Roboman1723


Да, вы должны использовать опцию -f для awk. Подробности смотрите на странице руководства.
saptarshi nag


1


С помощью sedудаления всего в строке перед определенным символом (определите в двойных скобках [Specific char]).

echo "randomcollege-nt\user90" | sed 's/.*[\]//'

Означает замену всех .*[\]символов ( ) перед \символом символом пробела ( //)

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

sed -i 's/.*[\]//' /path/to/FileName

1

Первоначальный вопрос задавался sed, но я вижу, что здесь популярны альтернативы.

Если вы используете Bash, расширение параметров является самым простым:

ORIGIN='randomcollege-nt\user90'
echo "${ORIGIN#*\\}"

Если вы ожидаете более одного обратного слеша, удвойте хеш-символы:

echo "${ORIGIN##*\\}"

Для получения дополнительной информации man bashи поиска Parameter Expansion.


0

В случае, если кто-то пытается удалить закомментированный # server_tokens off;из nginx автоматически, чтобы помочь с авто-dev-ops:

sudo sed -ri 's/#\s(server_tokens off;)/\1/' /etc/nginx/nginx.conf,

Протестировано и работает на nginx / 1.12.1 на Ubuntu 16.04 LTS. Соответствующий ответ по блокировке NGINX путем отключения токенов сервера здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.