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

14

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

randomcollege-nt\user90

к этому:

user90

используя sed?

Roboman1723
источник
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
Алаа али
источник
10

Другое sed:

$ echo "randomcollege-nt\user90" | LC_ALL=C sed -e 's/.*\\//'
user90

или положительно:

$ a='randomcollege-nt\user90'
$ printf '%s\n' "${a##*\\}"
user90
cuonglm
источник
1
Это не башизм, это shособенность POSIX . pubs.opengroup.org/onlinepubs/009604599/utilities/…
nyuszika7h
+1. не увидел ваш ответ, я удалю свой комментарий к ОП ^^
Оливье Дюлак
9

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

echo "randomcollege-nt\user90" | cut -d'\' -f2
Kervin
источник
1
Знать, как использовать инструмент, так же важно, как знать, какой инструмент использовать.
Rafał Cieślak
5

Это вопрос?

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

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

Archemar
источник
1
когда я бегу , что я /user90неuser90
Roboman1723
2
Нет, все в порядке, я получил user90.
saptarshi nag
3

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

echo "randomcollege-nt\user90" | awk -F\\ {'print $2'}
саптарши наг
источник
Есть ли способ с помощью awk редактировать файл на месте и не нужно выводить его в новый файл?
Roboman1723
@ Roboman1723 см stackoverflow.com/a/16531920/2072269
Мура
Да, вы должны использовать опцию -f для awk. Подробности смотрите на странице руководства.
saptarshi nag
1

Эта простая команда grep сделает всю работу,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90
Авинаш Радж
источник
1


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

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

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

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

sed -i 's/.*[\]//' /path/to/FileName
αғsнιη
источник
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 путем отключения токенов сервера здесь .

jamescampbell
источник