Видаліть першу частину струни за допомогою sed


14

Як я можу отримати це:

randomcollege-nt\user90

до цього:

user90

використовуючи sed?


2
Корисна порада: коли ви не впевнені, що робить команда, введіть, man the_command_nameі ви отримаєте корисну інструкцію для команди. Ви також можете зайти на www.google.com і ввести "посібник з іменем_команди", і ви знайдете безліч покрокових посібників.
DBedrenko

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. BTW, як здається, ви шукаєте вбудовану заміну sed, я додав таку команду.
Sylvain Pineau

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

1
@ Roboman1723 До свого запитання слід долучити оригінальний файл та потрібний результат, щоб усі бажаючі допомогли вам побачити його.
Sylvain Pineau

1
@SylvainPineau Я думаю, що перша команда не є відповідною.
Avinash Raj

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

якщо жало випадковогоколежу-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.Докладніше див. Сторінку man.
saptarshi nag


1


З sedвидалити все в рядку перед певним символом (визначте у подвійній дужці [Специфічна діаграма]).

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, щоб допомогти з автоматичним розробкою:

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.