Loại bỏ phần đầu tiên của chuỗi bằng sed


14

Làm thế nào để tôi có được từ này:

randomcollege-nt\user90

đến đây:

user90

sử dụng sed?


2
Một mẹo hữu ích: khi bạn không chắc chắn lệnh sẽ làm gì, hãy nhập man the_command_namevà bạn sẽ nhận được hướng dẫn sử dụng hữu ích cho lệnh. Bạn cũng có thể truy cập www.google.com và nhập "hướng dẫn Command_name" và bạn sẽ tìm thấy nhiều hướng dẫn từng bước.
DBedrenko

2
Để được hướng dẫn về sedchuyến thăm: grymoire.com/Unix/Sed.html
Pandya

Câu trả lời:


15

Tôi muốn sử dụng một cách đơn giản grepđể tìm kiếm user90:

$ echo "randomcollege-nt\user90" | grep -o user90
user90

Nếu user90 không đổi, hãy thích lệnh này:

$ echo "randomcollege-nt\user90" | grep -oP '(?<=randomcollege-nt\\)\w+'
user90

Cuối cùng sử dụng sedđể chỉnh sửa tập tin tại chỗ:

$ sed -ri 's/randomcollege-nt\\(user[0-9]+)/\1/' my_file

Hoặc để khớp với tất cả các tài khoản người dùng có thể:

$ sed -ri 's/randomcollege-nt\\(\w+)/\1/' my_file

Điều buồn cười là tôi đã thử điều đó và nó không có gì trở lại. Tôi đang sử dụng 12.04 nếu điều đó quan trọng. Nó chỉ hiển thị nếu tôi grep -Ftoàn bộ chuỗi.
Roboman1723

@ Roboman1723 đã thử nghiệm vào ngày 12.04, các lệnh đầu tiên của tôi hoạt động. Hãy chắc chắn rằng bạn không có bí danh grep được xác định ở đâu đó. BTW vì có vẻ như bạn đang tìm kiếm sự thay thế nội tuyến bằng sed Tôi đã thêm lệnh như vậy.
Sylvain Pineau

Có cách nào bạn có thể làm cho lệnh sed đó cắt bỏ tất cả "Randomcolitic-nt \" nhưng hiển thị nhiều hơn chỉ người dùng 90 không? Ví dụ: Randomcolitic-nt \ user90 Randomcolitic-nt \ user91 Randomcolitic-nt \ user92 Kết quả: user90 user91 user92
Roboman1723

1
@ Roboman1723 Bạn nên đính kèm tệp gốc và đầu ra mong muốn của bạn vào câu hỏi của bạn để mọi người sẵn sàng giúp bạn có thể xem nó.
Sylvain Pineau

1
@SylvainPineau tôi nghĩ rằng lệnh đầu tiên không phải là một lệnh thích hợp.
Avinash Raj

19

Bạn đang phân tích một số văn bản để trích xuất tên người dùng từ một domain\usernamechuỗi, rất có thể là từ Windows. Hầu hết các câu trả lời trên chỉ giải quyết chuỗi ví dụ cụ thể của bạn.

Cách tốt nhất để làm điều này là sử dụng regex trong sed để trích xuất bất cứ thứ gì có sau \. Đây là cách bạn sẽ làm điều đó:

sed 's|.*\\\(.*\)|\1|'

Điều đó sẽ khớp với tất cả mọi thứ ( .*) cho đến khi dấu gạch chéo ngược (ở đây, chúng ta đang thoát nó, vì vậy nó \\), sau đó khớp với mọi thứ sau dấu gạch chéo ngược ( .*), nhưng làm cho nó trở thành một nhóm bắt giữ (ví dụ: đóng dấu ngoặc quanh nó, nhưng chúng ta cũng phải thoát họ, vì vậy \(.*\)). Bây giờ chúng ta có bất cứ thứ gì xuất hiện sau \chuỗi trong một nhóm chụp, chúng ta in nó bằng cách tham chiếu nó với \1.

Bạn có thể sử dụng sedlệnh trên với bất kỳ tên miền nào, không nhất thiết phải như vậy 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

Tôi biết bạn muốn sử dụng sed, nhưng tôi sẽ sử dụng thứ gì đó khác ...

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

1
Biết cách sử dụng một công cụ là cũng quan trọng như biết công cụ để sử dụng.
Rafał Cieślak

5

Đây có phải là câu hỏi?

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

nếu sting Randomcolitic-nt không được sử dụng lệnh awk phía trên / bên dưới.


1
khi tôi chạy mà tôi /user90không nhận đượcuser90
Roboman1723

2
Không sao, tôi có user90.
saptarshi nag

3

Thay vào đó, bạn sử dụng 'awk' để lọc "user90":

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

Có phải họ là một cách với awk để chỉnh sửa tệp tại chỗ và không phải xuất nó sang tệp mới?
Roboman1723


Có, bạn phải sử dụng tùy chọn -f để awk. Để biết chi tiết, hãy xem trang man.
saptarshi nag

1

Lệnh grep đơn giản này sẽ thực hiện công việc,

$ echo 'randomcollege-nt\user90' | grep -oP '[^\\]*$'
user90

1


Với việc sedxóa mọi thứ trong một chuỗi trước một ký tự cụ thể (xác định thành dấu ngoặc kép [char cụ thể]).

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

Có nghĩa là thay thế tất cả ( .*[\]) ký tự trước một \char bằng ký tự khoảng trắng ( //)

Nếu bạn có một tập tin và muốn thay thế, hãy sử dụng -icờ trong sedlệnh như thế này:

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

1

Câu hỏi ban đầu được yêu cầu sed, nhưng tôi thấy rằng các lựa chọn thay thế là phổ biến ở đây.

Nếu bạn đang sử dụng Bash, việc mở rộng tham số đơn giản nhất:

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

Nếu bạn có khả năng mong đợi nhiều hơn một dấu gạch chéo ngược, hãy nhân đôi dấu băm:

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

Để biết thêm thông tin, man bashvà tìm kiếm Parameter Expansion.


0

Trong trường hợp bất cứ ai đang cố gắng tự động xóa nhận xét khỏi # server_tokens off;nginx để trợ giúp với tự động phát triển:

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

Đã thử nghiệm và làm việc cho nginx / 1.12.1 trên Ubuntu 16.04 LTS. Câu trả lời liên quan để khóa NGINX bằng cách tắt mã thông báo máy chủ tại đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.