Yanıtlar:
Bir örnek faydalı olabilir, ancak sizi doğru anladıysam, bu işe yarardı:
echo "Hello: world" | cut -f1 -d":"
Bu "merhaba: dünya" yı "merhaba" a dönüştürecektir.
basenameve gibi alt kabukları çalıştırmaktan daha iyidir cut, Dennis'in aşağıdaki cevabına bakın
cutstdin'den okuyabilir, bu nedenle özellikle bir dosyanın içeriği gibi işlemeniz gereken çok uzun bir dizeniz olduğunda daha iyidir.
hello: world. Bu yarım cevap.
Bash'te (ve ksh, zsh, tire, vb.), %Dizenin sonundaki #karakterleri kaldıracak veya dizenin başındaki karakterleri kaldıracak parametre genişletmeyi kullanabilirsiniz . Bu karakterlerden tek birini kullanırsanız, eşleşen en küçük dize kaldırılır. Karakteri iki katına çıkarırsanız, en uzun karakter kaldırılır.
$ 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:worldhale gelecektir hello:wokullanarak ${a%:*}?
"${a##*:}"sadece almak için eklemek de güzel olacak tomorrow=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$':; [[$ a = ~ $ desen]]; echo "$ {BASH_REMATCH [1]}" `. Bu sadece bir kolon varsa eşleşir. Bunun isteğe bağlı olmasını istiyorsanız, farklı bir desen kullanılması gerekir. Bash normal ifadelerinin (ve genel olarak normal ifadelerin) açıklaması bu yorumların kapsamı dışındadır. Bu konuyu tartışan veya kendinize ait başka sorular bulabilirsiniz.
egrep -o '^[^:]*:'
egrepile grep olduğunu -E. Burada normalden fark yok grep. -ogrep'e, satırın yalnızca ifadeyle eşleşen kısmını yazdırmasını söyler. ^eşleşmeyi satırın başına sabitler. [^:]*karakter olmayan sıfır veya daha fazla karakterle eşleşir :. :karakteri eşleştirir :.
Diyelim ki şu biçimde bir dosyaya sahip bir yolunuz var:
/dirA/dirB/dirC/filename.file
Şimdi sadece dört "/" içeren yolu istiyorsunuz. tip
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
ve çıktınız
/dirA/dirB/dirC
Cut kullanmanın avantajı, en üstteki dizinin yanı sıra dosyayı da kesebilmenizdir (bu örnekte);
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
Çıktınız
/dirA/dirB
Her şeyi dizenin diğer tarafından da yapabilseniz de, bu durumda yazmak çok mantıklı olmaz.
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
sonuç
dirA/dirB/dirC
Diğer bazı durumlarda, son dava da yardımcı olabilir. Son çıktının başında "/" olmadığını unutmayın.
son ":" örneğinden sonra her şeyi kırp
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
ve son ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: Değiştirmek istediğimiz :ile /(sed kolon olması gereken yerde \/)
cutama Dennis'in cevabı daha iyi ve daha esnek. Herkes yeni bir süreç ortaya çıkıp çıkmadığını biliyor mucut?