ฉันต้องการค้นหาบรรทัดในรหัสของฉันที่มีความยาวเกินกว่าที่กำหนด รหัสของฉันมีหลายไฟล์ วิธีที่ดีในการทำเช่นนี้คืออะไร?
ฉันต้องการทราบไฟล์และหมายเลขบรรทัด เนื้อหาจะเป็นที่ต้องการ แต่ไม่จำเป็น จุดประสงค์ของการฝึกคือเพื่อหาวิธีแยกเส้น (อาจเป็นด้วยตนเอง)
ฉันต้องการค้นหาบรรทัดในรหัสของฉันที่มีความยาวเกินกว่าที่กำหนด รหัสของฉันมีหลายไฟล์ วิธีที่ดีในการทำเช่นนี้คืออะไร?
ฉันต้องการทราบไฟล์และหมายเลขบรรทัด เนื้อหาจะเป็นที่ต้องการ แต่ไม่จำเป็น จุดประสงค์ของการฝึกคือเพื่อหาวิธีแยกเส้น (อาจเป็นด้วยตนเอง)
คำตอบ:
ด้วยgrep
:
grep -En '.{12}' file
สำหรับบรรทัดที่มีความยาวอย่างน้อย 12 ตัวอักษร
มีหลายไฟล์:
find . -type f -exec grep -En '.{12}' {} +
grep
การใช้งานบางอย่างเช่น GNU grep
สามารถค้นหาไฟล์ได้ด้วยตนเอง
grep -rEn '.{12}' .
แต่ระวัง symlink และไฟล์อื่น ๆ ที่ไม่ปกติ
โซลูชัน AWK
awk '{
if (length($0) > 5)
print $0;'} yourfile
หรือรัดกุมมากขึ้น:
awk 'length > 5' file
awk 'length > 5'
awk
ความหรูหราที่ค่อนข้างน้อย แต่รัดกุมawk '/^.{6,}/'
awk '/.{6}/'
(จริง ๆ แล้ว GNU awk จนกระทั่งเมื่อเร็ว ๆ นี้เคยเป็นคนหนึ่งที่ไม่สามารถทำงานได้เว้นแต่คุณจะผ่าน POSIXLY_CORRECT ไปยังสภาพแวดล้อมของมัน)
เนื่องจากสิ่งหนึ่งที่ขาดหายไปคือsed
ทางออก
sed -n '/^.\{6,\}/p' file
Bash solution
#!/bin/bash
count=0
while read; do
((++count))
len=${#REPLY}
if ((len > 80)); then
echo "Line $count is $len characters."
fi
done
./whatever.sh < input.file
ดังนั้นเช่น สิ่งนี้ไม่รวมถึงการขึ้นบรรทัดใหม่ด้วยการลบ 1 จาก$len
; หากไม่เป็นที่น่าพอใจหรือข้อมูลของคุณใช้ตอนจบ CRLF คุณควรปรับเปลี่ยนให้เหมาะสม
${#line}
หลีกเลี่ยงexpr
ทางแยกล่ะ?
bash
วิธีแก้ปัญหาที่บริสุทธิ์ แต่โปรดทราบว่าหากคุณไม่ติดIFS=
อยู่ข้างหน้าread
ช่องว่างนำหน้าจะถูกละเว้น
$line
ดังนั้นจึงไม่จำเป็นต้องลบออก
read
ชื่อให้อ่านมันจะอ่านREPLY
และรวมช่องว่างทั้งหมด ไม่IFS
จำเป็นต้องตั้งค่าใด ๆ
while read
การวนลูปไปยังข้อความเป็นสิ่งที่ปฏิบัติได้จริง
ด้วยperl
(เช่น) สมมติว่าคุณกำลังค้นหาบรรทัดที่ยาวเกิน 80 อักขระ:
ในการแสดงเส้น:
$ perl -nle 'print if length > 80' your_file
ในการแสดงหมายเลขบรรทัด:
$ perl -nle 'print "$.\n" if length > 80' your_file
หรือทั้งคู่:
$ perl -nle 'print "[$.]: $_\n" if length > 80' your_file
-l
บรรทัดคำสั่งperl
จะนับการแบ่งบรรทัดในบรรทัดของคุณ
ทับทิม:
ruby -lne 'puts $_ if $_.size > 5' intputfile
งูหลาม:
python -c "import sys;[ sys.stdout.write(''.join(line)) for line in sys.stdin if len(line.strip()) > 5 ]" < inputfile
นี่เป็นอีกวิธีแก้ปัญหาทุบตี (ทุบตี 4):
minlen=5 # minimum length of a line
mapfile -tO1 < inputfile # Map the file to the array MAPFILE (by default)
# Start the array at index 1
for i in "${!MAPFILE[@]}"; do
(( ${#MAPFILE[i]} > minlen )) || unset MAPFILE[i] # Remove shorter elements
done
อาเรย์ที่เกิดขึ้นนั้นกระจัดกระจายดังนั้นดัชนีอาเรย์จึงถูกเก็บรักษาไว้ ตั้งแต่เราเริ่มต้นที่ 1 ดัชนีคือหมายเลขบรรทัดของบรรทัดที่เราเก็บไว้ เราสามารถส่งออกเฉพาะหมายเลขบรรทัดเหล่านั้น:
printf 'Long lines found at: '
printf '%d, ' "${!MAPFILE[@]}"
echo
หรือเราสามารถเอาท์พุทเส้นเองได้:
printf '%s\n' "${MAPFILE[@]}"
grep
) หรือเป็นหมายเลขบรรทัดหรือเป็นอย่างอื่น (บางทีคุณต้องการที่จะใช้การกระทำอื่นกับพวกเขา)? อาจเป็นวิธีที่สะดวกที่สุดในการทำเช่นนี้ขึ้นอยู่กับสิ่งที่จะทำกับบรรทัดเหล่านี้ต่อไป