Yanıtlar:
awk burada daha iyi bir araç olabilir.
$ cat test.dat
LINE 1
LINE 2
POP3_SERVER_NAME = localhost
"POP3_SERVER_NAME" içeren satırları arayın; son alanı yazdırın. Bu, POP3_SERVER_NAME adlı kullanıcının her zaman 3. satırda olmasına bağlı değildir, bu muhtemelen İyi Bir Şeydir.
$ awk '/POP3_SERVER_NAME/{print $NF}' test.dat
localhost
Uygulamanıza bağlı olarak, normal ifadeyi daha katı hale getirmeniz gerekebilir. Örneğin, yalnızca POP3_SERVER_NAME ile başlayan çizgiyi eşleştirmek isteyebilirsiniz.
$ awk '/^POP3_SERVER_NAME/{print $NF}' test.dat
localhost
Sed kullanmak biraz daha az sezgiseldir. (Teşekkürler, ironinin farkındayım.) Her yerde POP3_SERVER_NAME içeren satırı ele alın. Satırın başından itibaren "=" işaretinden sonra isteğe bağlı alana tüm metin için boş bir dize yazın. Sonra yazdırın.
sed -n -e '/POP3_SERVER_NAME/ s/.*\= *//p' test.dat
awkboşluklardan kullanarak başka bir şeye değiştirebilirsiniz -F. Örneğin: bahsettiğiniz durumda bir sınırlayıcı olarak -F "="kullanılır =.
pKomutu, satırın istenmeyen kısmını kaldıran bir ikameyle değiştirin .
sed -n '3 s/^[^=]*= *//p' installation.sh
Satırı konuma göre değil, anahtar kelimeyle eşleştirmek isteyebilirsiniz.
sed -n 's/^ *POP3_SERVER_NAME *= *//p' installation.sh
Bir yapılandırma dosyanız var gibi görünüyor. Yapabileceğiniz şey Adam Siemeon / slm'nin önerilerine benzer:
sed -nr 's/[^=]+=\s*(.+)$/\1/p' filename
yerde [^=]hariç tüm '=' karakterler, +bir veya daha fazla karakter aynı tip, bu gerçek bir takip söyler =, \ssekme gibi herhangi bir boşluk ( \tve yeni hatları \n, \r\nve düz alanların '' ise *aracı sıfır ya da daha fazla aynı tipte , parantez 2, ..., \ n yedek tutucuları, \ \ 1 içine eşleşti karakter dizilerini yerleştirmek için içinde ne yakalamak $bir satırın sonuyla demektir Bu tipik yedek bir yol izler. s/.../.../modifiers. komut satırı seçeneği -raçılımı genişletilmiş düzenli ifade sözdizimi (kolaylık olması açısından) ve -naçıkça talep edilene kadar veya istenmedikçe hiçbir şey çıktı alma anlamına gelir p.
gDeğiştirici ile global bir arama yapabilirsiniz :
sed -nr 's/[^=]+=\s*(.+)$/\1 /pg' filename # note the space after \1
böylece ayrılmış bir dize almak ' '(olabilir \n, \tya da ne var) kolayca işleyebilir.
Her ikisi de değerlerinizin önünde bir satırın sonuna kadar denklem karakteri sürmesi ve ardından yorum veya basit bir "değer" den farklı anlambilimine sahip diğer karakterler gelmemesi koşuluyla geçerlidir.
Burada başkalarının yayınlarına henüz yorum yapamam. Satırı belirtmek için, 3 numaralı durumda s, başlangıç teklifinden önce veya önce satır numarasını iletin (tıpkı vim'de olduğu gibi).
sed -nr '3s/[^=]+=\s*(.+)$/\1/p' filename
Lütfen bir göz atın info sed. Örneğin, 3.2 ve 4.7 sizin için özellikle önemlidir.
echo "POP3_SERVER_NAME = localhost" | sed 's/.*= //'
localhost
Veya bir dosyadaki içeriğe sahipseniz:
sed 's/.*= //' somefile.txt
localhost
Linux / Unix'in güzelliği, bir şeyi başarmanın genellikle birden fazla yolu olmasıdır. Operasyon durumunda, dosyadan POP sunucusu adını çıkarmanın en az dört farklı yolu vardır:
grep POP3_SERVER_NAME installation.sh | cut -d'=' -f2grep POP3_SERVER_NAME installation.sh | awk '{print $3}'grep POP3_SERVER_NAME installation.sh | sed 's/.*= //'sed -n 's/^.*POP3_SERVER_NAME = //p' installation.sh
awkKomut güzel - ama etrafında boşluk var sadece=. Bu işe yaramazPOP3_SERVER_NAME=localhost.