วิธีการนับจำนวนของตัวละครที่เฉพาะเจาะจงในแต่ละบรรทัด?


87

ฉันสงสัยว่าจะนับจำนวนอักขระเฉพาะในแต่ละบรรทัดด้วยโปรแกรมอรรถประโยชน์การประมวลผลข้อความได้อย่างไร

ตัวอย่างเช่นการนับ"ในแต่ละบรรทัดของข้อความต่อไปนี้

"hello!" 
Thank you!

บรรทัดแรกมีสองบรรทัดและบรรทัดที่สองมี 0

อีกตัวอย่างคือการนับ(ในแต่ละบรรทัด


1
เพียงแค่เพิ่มว่าคุณได้รับประสิทธิภาพที่เพิ่มขึ้นอย่างมากโดยการเขียนโปรแกรม C 10 บรรทัดของคุณเองสำหรับสิ่งนี้แทนที่จะใช้นิพจน์ทั่วไปที่มี sed คุณควรพิจารณาดำเนินการตามขนาดของไฟล์อินพุตของคุณ
user606723

คำตอบ:


104

คุณสามารถทำได้ด้วยsedและawk:

$ sed 's/[^"]//g' dat | awk '{ print length }'
2
0

ในกรณีที่datเป็นข้อความของคุณตัวอย่างเช่นลบ sed (สำหรับแต่ละบรรทัด) ทั้งหมดที่ไม่ใช่"ตัวอักษรและawkภาพพิมพ์แต่ละบรรทัดขนาดของมัน (เช่นlengthเทียบเท่ากับlength($0)ที่$0หมายถึงบรรทัดปัจจุบัน)

สำหรับตัวละครอื่นคุณเพียงแค่เปลี่ยนสีหน้า ตัวอย่างเช่นสำหรับ(:

's/[^(]//g'

อัปเดต: sedเป็นงานมากเกินไปสำหรับงาน - trเพียงพอแล้ว โซลูชันที่เทียบเท่ากับtrคือ:

$ tr -d -c '"\n' < dat | awk '{ print length; }'

หมายความว่าtrลบตัวอักษรทั้งหมดที่ไม่ได้ ( -cหมายถึงการเติมเต็ม) "\nในชุดอักขระ


3
+1 ควรมีประสิทธิภาพมากกว่าtr& wcรุ่น
Stéphane Gimenez

1
ใช่ แต่สามารถจัดการ Unicode ได้หรือไม่
แอมเฟตามาจิน

@amphetamachine ใช่ - อย่างน้อยการทดสอบอย่างรวดเร็วด้วยß(UTF ฐานสิบหก: c3 9f) (แทน") ทำงานตามที่คาดไว้คือtr, sedและawkไม่เสริม / ทดแทน / นับโดยไม่มีปัญหา - บนระบบ Ubuntu 10.04
maxschlepzig

1
เวอร์ชันส่วนใหญ่trรวมถึง GNU tr และ Unix tr แบบคลาสสิกทำงานกับอักขระไบต์เดียวและไม่สอดคล้องกับ Unicode .. อ้างอิงจากWikipedia tr (Unix) .. ลองตัวอย่างนี้: echo "aā⧾c" | tr "ā⧾" b... บน Ubuntu 10.04 ... ßเป็นไบต์เดียวอักขระภาษาละตินแบบขยายและจัดการโดยtr... ปัญหาจริงของที่นี่ไม่ใช่ที่trไม่รองรับ Unicode (เนื่องจากตัวอักษรทั้งหมดเป็น Unicode) เป็นเรื่องจริงที่trจัดการเพียงหนึ่งไบต์ในแต่ละครั้ง ..
Peter.O

@ เฟรด, ไม่, ßไม่ใช่อักขระไบต์เดียว - ตำแหน่ง Unicode คือ U + 00DF ซึ่งมีรหัสเป็น 'c3 9f' ใน UTF-8 เช่นสองไบต์
maxschlepzig

49

ฉันแค่จะใช้ awk

awk -F\" '{print NF-1}' <fileName>

ที่นี่เราตั้งตัวคั่นฟิลด์ (พร้อมกับแฟล็ก -F) เป็นตัวละคร"ดังนั้นทั้งหมดที่เราทำคือพิมพ์จำนวนฟิลด์NF- 1. จำนวนที่เกิดขึ้นของตัวละครเป้าหมายจะน้อยกว่าหนึ่งจำนวนฟิลด์ที่แยกออกจากกัน

สำหรับตัวละครตลกที่ถูกตีความโดยเชลล์คุณเพียงแค่ต้องแน่ใจว่าคุณหลบหนีพวกมันมิฉะนั้นบรรทัดคำสั่งจะพยายามและตีความพวกเขา ดังนั้นสำหรับทั้งคู่"และ)คุณต้องหลีกเลี่ยงตัวคั่นฟิลด์ (พร้อม\)


1
อาจแก้ไขคำตอบของคุณเพื่อใช้อัญประกาศเดี่ยวแทนเพื่อหลบหนี มันจะทำงานกับตัวละครใด ๆ (ยกเว้น') นอกจากนี้มันยังมีพฤติกรรมแปลก ๆ ที่มีเส้นว่าง
Stéphane Gimenez

คำถามใช้โดยเฉพาะ"ดังนั้นฉันรู้สึกว่าจำเป็นต้องทำให้รหัสทำงานกับมัน มันขึ้นอยู่กับว่าคุณใช้เชลล์ตัวไหนในการพยากรณ์อากาศตัวละครจะต้องหลบหนี แต่ bash / tcsh ทั้งคู่จะต้องหลบหนี "
Martin York

แน่นอน -F'"'แต่มีปัญหากับไม่มี
Stéphane Gimenez

+1 เป็นความคิดที่ดีที่จะใช้ FS .... ซึ่งจะแก้ไขบรรทัดว่างที่แสดง -1 และตัวอย่างเช่น "$ 1" จากบรรทัดคำสั่ง bash ...awk -F"$1" '{print NF==0?NF:NF-1}' filename
Peter.O

ทำงานร่วมกับหลายตัวอักษรเป็นตัวแยก ... มีประโยชน์!
COIL

14

ใช้trรพชwc:

function countchar()
{
    while IFS= read -r i; do printf "%s" "$i" | tr -dc "$1" | wc -m; done
}

การใช้งาน:

$ countchar '"' <file.txt  #returns one count per line of file.txt
1
3
0

$ countchar ')'           #will count parenthesis from stdin
$ countchar '0123456789'  #will count numbers from stdin

3
บันทึก. trไม่รองรับอักขระที่ใช้มากกว่าหนึ่งไบต์ .. ดู Wikipedia tr (Unix) .. เช่น trไม่รองรับ Unicode
Peter.O


คุณต้องลบอักขระช่องว่างออก$IFSมิฉะนั้นreadจะตัดแต่งอักขระเหล่านั้นตั้งแต่เริ่มต้นและสิ้นสุด
Stéphane Chazelas


@ Peter.O trการใช้งานบางอย่างรองรับอักขระหลายwc -cไบต์แต่นับจำนวนไบต์ไม่ใช่ตัวอักษรต่อไป (ต้องการwc -mตัวอักษร)
Stéphane Chazelas

11

แต่การดำเนินการอื่นที่ไม่ต้องพึ่งพาโปรแกรมภายนอกในbash, zsh, yashและการใช้งานบาง / รุ่นksh:

while IFS= read -r line; do 
  line="${line//[!\"]/}"
  echo "${#line}"
done <input-file

ใช้สำหรับการนับline="${line//[!(]}"(


เมื่อบรรทัดสุดท้ายไม่มี trailing \ n, while loop ออกเนื่องจากแม้ว่ามันจะอ่านบรรทัดสุดท้ายมันก็จะส่งคืนรหัสทางออกที่ไม่เป็นศูนย์เพื่อระบุ EOF ... เพื่อให้ได้รอบ ๆ มันตัวอย่างต่อไปนี้ทำงาน (.. มันถูกดักฟังฉันมาระยะหนึ่งแล้วและฉันเพิ่งค้นพบวิธีแก้ปัญหานี้) ... eof=false; IFS=; until $eof; do read -r || eof=true; echo "$REPLY"; done
Peter.O

@Gilles: คุณเพิ่มส่วนต่อท้าย/ที่ไม่จำเป็นในการทุบตี มันเป็นข้อกำหนดของ ksh หรือไม่?
enzotib

1
ต้องการการติดตาม/ใน ksh รุ่นเก่าและ IIRC ใน bash รุ่นเก่าเช่นกัน
Gilles

10

คำตอบที่ใช้awkล้มเหลวหากจำนวนการแข่งขันมีขนาดใหญ่เกินไป (ซึ่งเกิดขึ้นกับสถานการณ์ของฉัน) สำหรับคำตอบจากloki-astariจะรายงานข้อผิดพลาดต่อไปนี้:

awk -F" '{print NF-1}' foo.txt 
awk: program limit exceeded: maximum number of fields size=32767
    FILENAME="foo.txt" FNR=1 NR=1

สำหรับคำตอบจากenzotib (และเทียบเท่าจากmanatwork ) ข้อผิดพลาดการแบ่งส่วนเกิดขึ้น:

awk '{ gsub("[^\"]", ""); print length }' foo.txt
Segmentation fault

การsedแก้ปัญหาโดยmaxschlepzigทำงานได้อย่างถูกต้อง แต่ช้า (การกำหนดเวลาด้านล่าง)

วิธีแก้ปัญหาบางอย่างยังไม่ได้แนะนำที่นี่ ก่อนอื่นให้ใช้grep:

grep -o \" foo.txt | wc -w

และการใช้perl:

perl -ne '$x+=s/\"//g; END {print "$x\n"}' foo.txt

ต่อไปนี้เป็นเวลาบางส่วนของการแก้ปัญหา (สั่งช้าไปเร็วที่สุด) ฉัน จำกัด บางสิ่งสำหรับผู้เดินสมุทรที่นี่ 'foo.txt' เป็นไฟล์ที่มีหนึ่งบรรทัดและหนึ่งสตริงที่มีความยาว 84922 ตรงกัน

## sed solution by [maxschlepzig]
$ time sed 's/[^"]//g' foo.txt | awk '{ print length }'
84922
real    0m1.207s
user    0m1.192s
sys     0m0.008s

## using grep
$ time grep -o \" foo.txt | wc -w
84922
real    0m0.109s
user    0m0.100s
sys     0m0.012s

## using perl
$ time perl -ne '$x+=s/\"//g; END {print "$x\n"}' foo.txt
84922
real    0m0.034s
user    0m0.028s
sys     0m0.004s

## the winner: updated tr solution by [maxschlepzig]
$ time tr -d -c '\"\n' < foo.txt |  awk '{ print length }'
84922
real    0m0.016s
user    0m0.012s
sys     0m0.004s

+ ความคิดที่ดี! ผมขยายตารางของคุณในคำตอบใหม่รู้สึกอิสระที่จะแก้ไข (ภาพสุดท้ายคือไม่ชัดเจนดังนั้น แต่ผมเชื่อว่า @maxschlepzig เป็นเหล็กแก้ปัญหาได้เร็วขึ้น)
JJoao

วิธีการแก้ปัญหาของ maxschlepzig เร็วสุด ๆ !
okwap


8

การใช้งานอื่นที่เป็นไปได้ด้วย awk และ gsub:

awk '{ gsub("[^\"]", ""); print length }' input-file

ฟังก์ชั่นgsubเทียบเท่าของ 's///g'sed

ใช้สำหรับการนับgsub("[^(]", "")(


คุณสามารถบันทึกอักขระหนึ่งตัวเช่นเมื่อลบการเปลี่ยนเส้นทาง stdin ... ;)
maxschlepzig

@maxschlepzig: ใช่แน่นอน;)
enzotib

1
awk '{print gsub(/"/,"")}' input-fileจะเพียงพอเช่นเดียวกับ "สำหรับแต่ละสตริงย่อยที่จับคู่นิพจน์ปกติ r ในสตริง t แทนสตริง s และส่งกลับจำนวนการแทนที่" (man awk)
manatwork

6

ฉันตัดสินใจที่จะเขียนโปรแกรม C เพราะฉันเบื่อ

คุณควรจะเพิ่มการตรวจสอบความถูกต้องของอินพุต แต่นอกเหนือจากที่กำหนดไว้ทั้งหมด

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
        char c = argv[1][0];
        char * line = NULL;
        size_t len = 0;
        while (getline(&line, &len, stdin) != -1)
        {
                int count = 0;
                char * s = line;
                while (*s) if(*s++ == c) count++;
                printf("%d\n",count);
        }
        if(line) free(line);
}

ขอบคุณ! ขอบคุณที่รู้สึกเบื่อเพื่อที่ฉันจะได้เรียนรู้อะไรบางอย่าง เดี๋ยวก่อนคุณต้องการผลตอบแทนหรือไม่?
ทิม

* shrugs *หากคุณต้องการแก้ไขให้ถูกต้องคุณต้องเพิ่ม #includes อีกสองสามรายการ แต่คำเตือนเริ่มต้นในคอมไพเลอร์ของฉันดูเหมือนจะไม่สนใจ
user606723

คุณสามารถออกจากfree(line)เพราะออกจากโปรแกรมโดยปริยายหน่วยความจำที่จัดสรรทั้งหมด - จากนั้นมีสถานที่สำหรับreturn 0;... ;) แม้ในตัวอย่างมันก็ไม่ได้เป็นวิธีที่ดีที่จะปล่อยให้รหัสส่งคืนไม่ได้กำหนด Btw getlineเป็นส่วนขยายของ GNU - ในกรณีที่มีคนสงสัย
maxschlepzig

@maxschlepzig: หน่วยความจำถูกชี้ไปตามบรรทัดที่จัดสรรโดย getline () หรือไม่ มันถูกจัดสรรแบบไดนามิกบน heap โดย malloc หรือแบบสแตติกบนสแต็กหรือไม่? คุณบอกว่าการปล่อยมันไม่จำเป็นดังนั้นจึงไม่จัดสรรแบบไดนามิกหรือไม่
ทิม

1
@Tim ใช่เช่นถ้าคุณ refactor รหัสดังกล่าวว่าเป็นฟังก์ชั่นแบบสแตนด์อโลน - พูด - fซึ่งเรียกว่าหลายครั้งจากรหัสอื่น ๆ จากนั้นคุณจะต้องโทรfreeหลังจากการโทรครั้งสุดท้ายของgetlineตอนท้ายของฟังก์ชั่นfนี้
maxschlepzig

6

สำหรับสตริงที่ง่ายที่สุดคือด้วยtrและwc(ไม่จำเป็นต้อง overkill ด้วยawkหรือsed) - แต่ให้สังเกตความคิดเห็นข้างต้นเกี่ยวกับtrจำนวนไบต์ไม่ใช่ตัวอักษร -

echo $x | tr -d -c '"' | wc -m

โดยที่$xเป็นตัวแปรที่มีสตริง (ไม่ใช่ไฟล์) ที่จะประเมิน


4

นี่คือโซลูชัน C อื่นที่ต้องการเพียง STD C และหน่วยความจำน้อยกว่า:

#include <stdio.h>

int main(int argc, char **argv)
{
  if (argc < 2 || !*argv[1]) {
    puts("Argument missing.");
    return 1;
  }
  char c = *argv[1], x = 0;
  size_t count = 0;
  while ((x = getc(stdin)) != EOF)
    if (x == '\n') {
      printf("%zd\n", count);
      count = 0;
    } else if (x == c)
      ++count;
  return 0;
}

สิ่งนี้จะไม่รายงานในบรรทัดสุดท้ายหากไม่มีส่วนท้าย '\ n'
Peter.O

1
@ เฟรดใช่ซึ่งเป็นจุดประสงค์เนื่องจากบรรทัดที่ไม่มีการต่อท้าย\nไม่ใช่บรรทัดจริง นี่เป็นพฤติกรรมเดียวกับคำตอบ sed / awk (tr / awk) อื่น ๆ ของฉัน
maxschlepzig

3

เราสามารถใช้grepกับการregexที่จะทำให้มันง่ายขึ้นและมีประสิทธิภาพ

เพื่อนับจำนวนตัวอักษรที่เฉพาะเจาะจง

$ grep -o '"' file.txt|wc -l

หากต้องการนับอักขระพิเศษรวมถึงอักขระช่องว่าง

$ grep -Po '[\W_]' file.txt|wc -l

ที่นี่เรากำลังเลือกตัวละครใด ๆ ที่มี[\S\s]และมี-oตัวเลือกที่เราทำgrepเพื่อพิมพ์แต่ละการแข่งขัน จากนั้นใช้wc -lในการนับแต่ละบรรทัด


OP ไม่ต้องการพิมพ์จำนวนอักขระทั้งหมดในไฟล์! เขาต้องการนับ / พิมพ์หมายเลขของอักขระเฉพาะ เช่น"มีจำนวนเท่าใดในแต่ละบรรทัด และตัวอักษรอื่น ๆ ดูคำถามและคำตอบที่เขายอมรับ
αғsнιη

3

บางทีคำตอบที่ตรงไปตรงมากว่านั้นคำตอบ awk ล้วน ๆ ก็คือการใช้ split การแยกใช้สตริงและเปลี่ยนเป็นอาร์เรย์ค่าส่งคืนคือจำนวนของรายการอาร์เรย์ที่สร้างขึ้น + 1

รหัสต่อไปนี้จะพิมพ์จำนวนครั้ง "ปรากฏในแต่ละบรรทัด

awk ' {print (split($0,a,"\"")-1) }' file_to_parse

ข้อมูลเพิ่มเติมเกี่ยวกับการแยกhttp://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_92.html


2

นี่คือสคริปต์ Python แบบง่าย ๆ เพื่อค้นหาจำนวน"ในแต่ละบรรทัดของไฟล์:

#!/usr/bin/env python2
with open('file.txt') as f:
    for line in f:
        print line.count('"')

ที่นี่เราได้ใช้countวิธีการของstrชนิดในตัว


2

สำหรับโซลูชันทุบตีบริสุทธิ์ (อย่างไรก็ตามเป็นเฉพาะทุบตี): หาก$xเป็นตัวแปรที่มีสตริงของคุณ:

x2="${x//[^\"]/}"
echo ${#x2}

${x//สิ่งที่เอาตัวอักษรทั้งหมดยกเว้น", ${#x2}คำนวณความยาวของส่วนที่เหลือนี้

(คำแนะนำดั้งเดิมที่ใช้exprซึ่งมีปัญหาดูความคิดเห็น:)

expr length "${x//[^\"]/}"

โปรดทราบว่ามันเฉพาะ GNU exprและนับไบต์ไม่ใช่ตัวอักษร กับคนอื่น ๆexpr:expr "x${x...}" : "x.*" - 1
Stéphane Chazelas

โอ้ถูกต้องขอบคุณ! ฉันได้แก้ไขโดยใช้แนวคิดอื่นที่เพิ่งมีซึ่งมีข้อดีคือไม่ได้ใช้โปรแกรมภายนอกเลย
Marian

2

แทนที่aด้วยถ่านที่จะนับ เอาต์พุตคือตัวนับสำหรับแต่ละบรรทัด

perl -nE 'say y!a!!'

2

การเปรียบเทียบเวลาของโซลูชันที่นำเสนอ (ไม่ใช่คำตอบ)

ประสิทธิภาพของคำตอบนั้นไม่สำคัญ อย่างไรก็ตามตามวิธีการ @josephwb ฉันพยายามกำหนดเวลาคำตอบทั้งหมดที่นำเสนอ

ฉันใช้เป็นอินพุตในการแปลภาษาโปรตุเกสของ Victor Hugo "Les Miserables" (หนังสือยอดเยี่ยม!) และนับการเกิด "a" รุ่นของฉันมี 5 เล่มหลายหน้า ...

$ wc miseraveis.txt 
29331  304166 1852674 miseraveis.txt 

คำตอบ C ถูกรวบรวมด้วย gcc (ไม่มีการเพิ่มประสิทธิภาพ)

แต่ละคำตอบถูกเรียกใช้ 3 ครั้งและเลือกที่ดีที่สุด

อย่าไว้ใจตัวเลขเหล่านี้มากเกินไป (เครื่องของฉันกำลังทำงานอื่น ๆ ฯลฯ ) ฉันแบ่งปันเวลาเหล่านี้กับคุณเพราะฉันได้รับผลลัพธ์ที่ไม่คาดคิดและฉันแน่ใจว่าคุณจะพบอีก ...

  • โซลูชันที่หมดเวลา 14 จาก 16 รายการใช้เวลาน้อยกว่า 1 วินาที 9 น้อยกว่า 0.1 วินาทีส่วนมากใช้ท่อ
  • โซลูชัน 2 รายการที่ใช้ bash line ต่อบรรทัดประมวลผล 30k บรรทัดโดยสร้างกระบวนการใหม่คำนวณโซลูชันที่ถูกต้องใน 10s / 20s
  • grep -oP aต้นไม้เร็วขึ้นแล้วgrep -o a (10; 11 vs 12)
  • ความแตกต่างระหว่าง C และอื่น ๆ นั้นไม่ใหญ่อย่างที่ฉันคาดไว้ (7; 8 กับ 2; 3)
  • (ยินดีต้อนรับข้อสรุป)

(ผลลัพธ์แบบสุ่ม)

=========================1 maxschlepzig
$ time sed 's/[^a]//g' mis.txt | awk '{print length}' > a2
real    0m0.704s ; user 0m0.716s
=========================2 maxschlepzig
$ time tr -d -c 'a\n' < mis.txt | awk '{ print length; }' > a12
real    0m0.022s ; user 0m0.028s
=========================3 jjoao
$ time perl -nE 'say y!a!!' mis.txt  > a1
real    0m0.032s ; user 0m0.028s
=========================4 Stéphane Gimenez
$ function countchar(){while read -r i; do echo "$i"|tr -dc "$1"|wc -c; done }

$ time countchar "a"  < mis.txt > a3
real    0m27.990s ; user    0m3.132s
=========================5 Loki Astari
$ time awk -Fa '{print NF-1}' mis.txt > a4
real    0m0.064s ; user 0m0.060s
Error : several -1
=========================6 enzotib
$ time awk '{ gsub("[^a]", ""); print length }' mis.txt > a5
real    0m0.781s ; user 0m0.780s
=========================7 user606723
#include <stdio.h> #include <string.h> // int main(int argc, char *argv[]) ...  if(line) free(line); }

$ time a.out a < mis.txt > a6
real    0m0.024s ; user 0m0.020s
=========================8 maxschlepzig
#include <stdio.h> // int main(int argc, char **argv){if (argc < 2 || !*argv[1]) { ...  return 0; }

$ time a.out a < mis.txt > a7
real    0m0.028s ; user 0m0.024s
=========================9 Stéphane Chazelas
$ time awk '{print gsub(/a/, "")}'< mis.txt > a8
real    0m0.053s ; user 0m0.048s
=========================10 josephwb count total
$ time grep -o a < mis.txt | wc -w > a9
real    0m0.131s ; user 0m0.148s
=========================11 Kannan Mohan count total
$ time grep -o 'a' mis.txt | wc -l > a15
real    0m0.128s ; user 0m0.124s
=========================12 Kannan Mohan count total
$ time grep -oP 'a' mis.txt | wc -l > a16
real    0m0.047s ; user 0m0.044s
=========================13 josephwb Count total
$ time perl -ne '$x+=s/a//g; END {print "$x\n"}'< mis.txt > a10
real    0m0.051s ; user 0m0.048s
=========================14 heemayl
#!/usr/bin/env python2 // with open('mis.txt') as f: for line in f: print line.count('"')

$ time pyt > a11
real    0m0.052s ; user 0m0.052s
=========================15 enzotib
$ time  while IFS= read -r line; do   line="${line//[!a]/}"; echo "${#line}"; done < mis.txt  > a13
real    0m9.254s ; user 0m8.724s
=========================16 bleurp
$ time awk ' {print (split($0,a,"a")-1) }' mis.txt > a14
real    0m0.148s ; user 0m0.144s
Error several -1

1
grep -n -o \" file | sort -n | uniq -c | cut -d : -f 1

โดยที่ grep ทำการยกของหนักทั้งหมด: รายงานตัวละครแต่ละตัวที่พบที่หมายเลขแต่ละบรรทัด ส่วนที่เหลือเป็นเพียงการหาผลรวมการนับต่อบรรทัดและจัดรูปแบบเอาต์พุต

ลบ-nและรับการนับสำหรับไฟล์ทั้งหมด

การนับไฟล์ข้อความ 1.5Meg ในเวลาไม่เกิน 0.015 วินาทีนั้นรวดเร็ว
และใช้งานได้กับอักขระ (ไม่ใช่ไบต์)


1

ทางออกสำหรับการทุบตี ไม่มีโปรแกรมภายนอกที่เรียกว่า (เร็วกว่าสำหรับสตริงสั้น ๆ )

หากค่าอยู่ในตัวแปร:

$ a='"Hello!"'

สิ่งนี้จะพิมพ์จำนวน":

$ b="${a//[^\"]}"; echo "${#b}"
2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.