Câu trả lời:
Một ví dụ có thể hữu ích, nhưng nếu tôi hiểu đúng về bạn, điều này sẽ hoạt động:
echo "Hello: world" | cut -f1 -d":"
Điều này sẽ chuyển đổi "hello: world" thành "hello".
basename
và cut
, xem câu trả lời của Dennis bên dưới
cut
có thể đọc từ stdin, vì vậy tốt hơn là khi bạn có một chuỗi rất dài mà bạn cần xử lý, như nội dung của tệp.
hello: world
. Đây là một nửa câu trả lời.
Trong Bash (và ksh, zsh, dash, v.v.), bạn có thể sử dụng mở rộng tham số %
sẽ xóa các ký tự khỏi cuối chuỗi hoặc #
sẽ xóa các ký tự khỏi đầu chuỗi. Nếu bạn sử dụng một trong những ký tự đó, chuỗi kết hợp nhỏ nhất sẽ bị xóa. Nếu bạn nhân đôi nhân vật, lâu nhất sẽ bị xóa.
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
hello:world
sẽ trở thành hello:wo
bằng cách sử dụng ${a%:*}
?
"${a##*:}"
vào chỉ nhận tomorrow
=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'
; [[$ a = ~ $ mẫu]]; tiếng vang "$ {BASH_REMATCH [1]}" `. Điều đó chỉ phù hợp nếu có một dấu hai chấm. Nếu bạn muốn điều đó là tùy chọn, một mẫu khác sẽ được sử dụng. Một lời giải thích về Bash regexes (và regexes nói chung) nằm ngoài phạm vi của những bình luận này. Bạn có thể tìm thấy các câu hỏi khác thảo luận về điều này hoặc đăng bài của riêng bạn.
egrep -o '^[^:]*:'
egrep
là grep với -E
. Nó làm cho không có sự khác biệt ở đây từ thường xuyên grep
. -o
hướng dẫn grep chỉ in ra một phần của dòng khớp với biểu thức. ^
neo trận đấu đến đầu một dòng. [^:]*
khớp với 0 hoặc nhiều ký tự không phải là :
ký tự. :
phù hợp với nhân vật :
.
Giả sử bạn có một đường dẫn với một tệp ở định dạng này:
/dirA/dirB/dirC/filename.file
Bây giờ bạn chỉ muốn đường dẫn bao gồm bốn "/". Kiểu
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
và đầu ra của bạn sẽ là
/dirA/dirB/dirC
Ưu điểm của việc sử dụng cut là bạn cũng có thể cắt thư mục uppest cũng như tệp (trong ví dụ này), vì vậy nếu bạn gõ
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
đầu ra của bạn sẽ là
/dirA/dirB
Mặc dù bạn có thể làm tương tự từ phía bên kia của chuỗi, nhưng nó sẽ không có ý nghĩa nhiều trong trường hợp này như gõ
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
kết quả trong
dirA/dirB/dirC
Trong một số trường hợp khác, trường hợp cuối cùng cũng có thể hữu ích. Lưu ý rằng không có "/" ở đầu đầu ra cuối cùng.
cắt bỏ mọi thứ sau ví dụ cuối cùng của ":"
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
và nếu bạn muốn bỏ cái cuối cùng ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: bạn muốn thay thế :
bằng /
(nơi có dấu hai chấm \/
)
cut
hoạt động, nhưng câu trả lời của tôi Dennis là tốt hơn và linh hoạt hơn. Có ai biết nếu nó sinh ra một quá trình mới như thếcut
nào?