Làm cách nào tôi có thể tách các ký tự X đầu tiên khỏi chuỗi bằng sed?


126

Tôi đang viết kịch bản shell cho Linux nhúng trong một hộp công nghiệp nhỏ. Tôi có một biến chứa văn bản pid: 1234và tôi muốn loại bỏ các ký tự X đầu tiên khỏi dòng, vì vậy chỉ có 1234 ở lại. Tôi có nhiều biến hơn tôi cần "dọn dẹp", vì vậy tôi cần cắt bỏ các ký tự X đầu tiên và ${string:5}không hoạt động vì một số lý do trong hệ thống của tôi.

Điều duy nhất chiếc hộp dường như có sed.

Tôi đang cố gắng để làm cho những điều sau đây để làm việc:

result=$(echo "$pid" | sed 's/^.\{4\}//g')

Có ý kiến ​​gì không?


10
Nếu ${string:5}không hoạt động thì bạn không sử dụng Bash hoặc shell khác hỗ trợ cú pháp đó. Bạn đang sử dụng shell và phiên bản nào? Shebang của bạn trông như thế nào? Tôi đoán là bạn đang sử dụng sh(như dash) hoặc có thể zsh.
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


0

Điều này cũng sẽ làm công việc:

echo "$pid"|awk '{print $2}'

27
Câu hỏi này là lần truy cập đầu tiên cho "bỏ qua N ký tự đầu tiên trong chuỗi". Bạn đã không trả lời câu hỏi.
jww

Điều này dường như không hoạt động, và nếu có, bạn có thể giải thích làm thế nào
Alexander Mills

Nó không hoạt động trên hệ thống của tôi. Có thể có một vấn đề với dấu tách trường của bạn, hãy thử awk -F": " '{print $2}'. Tuy nhiên, không phải là giải pháp yêu thích của tôi.
mzuther

197

Sau đây nên làm việc:

var="pid: 1234"
var=${var:5}

Bạn có chắc không bash là shell thực thi kịch bản của bạn?

Ngay cả tuân thủ POSIX

var=${var#?????}

sẽ thích hợp hơn khi sử dụng một quy trình bên ngoài, mặc dù điều này đòi hỏi bạn phải mã hóa số 5 dưới dạng mẫu có độ dài cố định.


1
Bạn cũng có thể chỉ định độ dài với tham số thứ hai: ${var:5:2}sẽ bắt đầu tại 1và trả về 12.
Max Candocia

107

Đây là một phương pháp ngắn gọn để cắt các ký tự X đầu tiên bằng cách sử dụng cut(1). Ví dụ này loại bỏ 4 ký tự đầu tiên bằng cách cắt một chuỗi con bắt đầu bằng ký tự thứ 5.

echo "$pid" | cut -c 5-

2
Đây là giải pháp đơn giản nhất!
Brandon

2
Về mặt kỹ thuật, OP đã yêu cầu sed, nhưng tôi cảm thấy đây là giải pháp tốt nhất cho "Làm cách nào tôi có thể tách các ký tự X đầu tiên khỏi chuỗi [trong terminal / bash]" Khi được sử dụng kết hợp với git, thật tuyệt:git log --pretty=oneline | cut -c 42- | head
marksiemers

1
+1 Giải pháp đơn giản và hữu ích .. Khi tôi có URL là http: // <example.com> và để cắt giao thức 'http: //' Tôi phải nói là 8 ký tự thay vì 7. Tôi không biết , nhưng đó là cách nó làm việc cho tôi.
Santosh Kumar Arjunan

1
Santosh Kumar Arjunan: đó là vì ví dụ "echo" $ pid "| cut -c 4-" thực tế không cắt 4 ký tự đầu tiên mà trích xuất chuỗi con bắt đầu từ ký tự thứ 4. Do đó, nó thực sự cắt 3 ký tự đầu tiên. Do đó, nếu bạn muốn cắt 7 ký tự đầu tiên, bạn muốn trích xuất mọi thứ từ ký tự thứ 8 và do đó thực sự thực hiện "cắt -c 8-"
al-ash

1
@DeanHiller cut -c ${LEN}-. Các dấu ngoặc nhọn được sử dụng để nối chuỗi với các ký tự biến hợp lệ, để phân biệt đâu là biến và cái gì không. Nếu bạn muốn biết thêm thông tin về điều này, thì hãy tra cứu "nối chuỗi biến bash" để biết thêm tài nguyên về lý do / cách thức hoạt động của nó.
JustCarty

46

Sử dụng -rtùy chọn ("sử dụng các biểu thức chính quy mở rộng trong tập lệnh") sedđể sử dụng {n}cú pháp:

$ echo 'pid: 1234'| sed -r 's/^.{5}//'
1234

1
trường hợp này sẽ như thế nào, nếu tôi muốn tách các ký tự X cuối cùng khỏi chuỗi?
Kokesh

5
@Kokesh: bạn có thể làm sed -r 's/.{5}$//'để loại bỏ 5 ký tự cuối cùng
Mark Longair

7
Bạn có thể làm điều đó mà không cần -r( -Etrong OS X, IIRC) nếu bạn thoát khỏi dấu ngoặc nhọn (mặc dù không biết liệu nó có hoạt động trong OS X không).
Tạm dừng cho đến khi có thông báo mới.

2
@Dennis: Tôi vừa kiểm tra - thoát khỏi niềng răng (và rời khỏi -r/ -E) hoạt động trong OS X.
Gordon Davisson

15

Cắt hai ký tự đầu tiên từ chuỗi:

$ string="1234567890"; echo "${string:2}"
34567890

@ dtp70 Cảm ơn rất nhiều câu trả lời chung chung, nó hoạt động rất tốt!
wolfram77 14/03/2016

10

đưa nó qua awk '{print substr($0,42)}'nơi 42 là một trong số nhiều hơn số ký tự được thả. Ví dụ:

$ echo abcde| awk '{print substr($0,2)}'
bcde
$

8

Rất có thể, bạn cũng sẽ có cut. Nếu vậy:

[me@home]$ echo "pid: 1234" | cut -d" " -f2
1234

1
Rắc rối với cutviệc nó không xử lý các chuỗi khoảng trắng một cách hợp lý, sử dụng tr -s ' 'để "nén" các không gian làm cho nó hoạt động tốt hơn.
Thor

1
Nó không có nghĩa là một công cụ nhảy tất cả hát; nó đơn giản và làm như nó nói trên lon và có sẵn rộng rãi. Nó chỉ hoạt động tốt đối với các yêu cầu đã nói và chắc chắn sẽ mạnh mẽ hơn khi cắt bỏ các ký tự cố định từ các vị trí cụ thể.
Shawn Chin

5

Vâng, đã có giải pháp ở đây với sed, awk, cutvà sử dụng bashcú pháp. Tôi chỉ muốn ném vào một biến thể phù hợp POSIX khác:

$ echo "pid: 1234" | tail -c +6
1234

-ccho biết đuôi bắt đầu bù byte nào, đếm từ cuối dữ liệu đầu vào, nhưng nếu số bắt đầu bằng +dấu, thì đó là từ đầu dữ liệu đầu vào đến cuối.


4

Một cách khác, sử dụng cutthay vì sed.

result=`echo $pid | cut -c 5-`

Anh ấy muốn loại bỏ 4 ký tự đầu tiên. Điều này nhận được 4 ký tự đầu tiên.
MM.

2

Tôi tìm thấy câu trả lời trong sed nguyên chất được cung cấp bởi câu hỏi này (thừa nhận, được đăng sau khi câu hỏi này được đăng). Điều này thực hiện chính xác những gì bạn yêu cầu, chỉ trong sed:

result=\`echo "$pid" | sed '/./ { s/pid:\ //g; }'\``

Dấu chấm trong sed '/./) là bất cứ điều gì bạn muốn khớp. Câu hỏi của bạn chính xác là những gì tôi đã cố gắng, ngoại trừ trong trường hợp của tôi, tôi muốn khớp một dòng cụ thể trong một tệp và sau đó bỏ ghi chú. Trong trường hợp của tôi, đó là:

# Uncomment a line (edit the file in-place):
sed -i '/#\ COMMENTED_LINE_TO_MATCH/ { s/#\ //g; }' /path/to/target/file

Việc -isau sedlà chỉnh sửa tệp tại chỗ (xóa công tắc này nếu bạn muốn kiểm tra biểu thức khớp của mình trước khi chỉnh sửa tệp).

(Tôi đã đăng bài này vì tôi muốn làm điều này hoàn toàn với sed khi câu hỏi này được hỏi và không có câu trả lời nào trước đó đã giải quyết vấn đề đó.)


1

Thay vì loại bỏ n ký tự từ đầu, có lẽ bạn chỉ có thể trích xuất các chữ số trực tiếp. Giống như vậy ...

$ echo "pid: 1234" | grep -Po "\d+"

Đây có thể là một giải pháp mạnh mẽ hơn, và có vẻ trực quan hơn.

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.