grep เปลี่ยนตัวคั่น


12

ด้วยวิธีใดเราสามารถเปลี่ยนตัวคั่นที่ใช้ grep

ฉันคิดว่าโดยค่าเริ่มต้น grep ใช้\nเป็นตัวคั่น


ดูเหมือนว่าจะเหมาะกว่าใน SuperUser.com
Mitch Dempsey

อ่าน man page ดูว่ามีตัวเลือกดังกล่าวหรือไม่ (ไม่ฉันไม่เชื่อว่ามี)
Cascabel

ฉันได้อ่านแล้ว และไม่ไม่มีตัวเลือก

@ jhon: จากนั้นอย่าถามวิธีการเปลี่ยน grep ถามวิธีการทำสิ่งที่คุณต้องการจะทำกับสิ่งอื่น ตัวอย่างเช่นคุณสามารถระบุตัวคั่นเร็กคอร์ดใน perl ( $/) และ awk ( RS) echo "$var" | sed 's/<delimiter>/\n/' | grep <pattern>หรือคุณอาจจะทำสิ่งที่ชอบ หลายคำตอบขึ้นอยู่กับปัญหาที่แท้จริงของคุณ
Cascabel

คำตอบ:


2

คุณให้ความสำคัญกับผลลัพธ์ที่ได้trอาจเป็นผลดีต่อคุณ

che@nok ~ $ grep cpu /proc/cpuinfo | tr '\n' ';'
cpu family      : 6;cpu MHz             : 800.000;cpu cores     : 2;cpuid level : 10;cpu family : 6;cpu MHz : 800.000;cpu cores      : 2;cpuid level : 10;

อันที่จริงฉันมีข้อมูลเช่นนี้เก็บไว้ในตัวแปร: สิ่งที่ xxxxx yyyyyy @ aaaaaaaaa bbbbb @ asdasd @ asdsda @ asds ... @ ดังนั้นฉันเดาว่ามันเป็นไปได้: echo $ my_var | grep "บางอย่าง" งานนี้ แต่ไม่เป็นที่ฉันต้องการ grep ใช้เวลาพวงของข้อมูลที่เป็นเส้นเดียวที่ว่าทำไมฉันต้องการที่จะเปลี่ยนเป็นตัวอักษรที่เฉพาะเจาะจง (ที่นี่คือ '@')

แล้วคุณอาจจะพยายามวางไว้เช่นนี้:echo $my_var | tr @ '\n' | grep blahblah
che

ฉันได้ทำแล้ว แต่ดูเหมือนว่าเปลือกหอยเป็น "พยายาม" รันเนื้อหา: S

2
คุณต้องพูดตัวแปรเพื่อรักษาช่องว่างสีขาวและการขึ้นบรรทัดใหม่คือ$my var echo "$my_var" | ...
mrucci

1

agrepจาก University of Arizonaอนุญาตให้คุณตั้งค่าตัวคั่น มันไม่ใช่การแทนที่สำหรับ grep; มันใช้อัลกอริทึมที่แตกต่างกัน (grep โดยประมาณสามารถจับคู่ได้ถึงข้อผิดพลาด) และมีรูปแบบไวยากรณ์ที่แตกต่างกัน แต่มันเป็นเครื่องมือที่มีประโยชน์

น่าเสียดายที่ฉันคิดว่าเนื่องจากปัญหาด้านลิขสิทธิ์มีหลายโครงการที่คล้ายกันที่เรียกว่าagrepและพวกเขาไม่เข้ากันได้ทั้งหมด แต่ฉันคิดว่าทุกรุ่นอนุญาตให้คุณตั้งค่าตัวคั่น


1
case $# in
0|1|2)  cat >&2 <<EOF
    Usage: $0 delimiterstring pattern files....
    Behaves like grep -pdelimiterstring but on linux
    DOES NOT SUPPORT MOST ARGUMENTS
    unlike grep -p - leaves delimiterstring in output

    NO -p just the delimeterstring
    note: delimiterstring has to work in the sed command where the ${d} is
    if you are going to use @ in the delimeter string, then the @'s
    need to be replaced by someother character

EOF
    exit 0
;;
3)  mode=one ;;
*)  mode=many ;;
esac
d="${1}"
p="${2}"
shift 2
while [ $# -gt 1 ]
do
    sed "s@${d}@\x00@g" "${1}" | grep -z  "${p}" -  | (
        case $mode in 
        many) sed -e "s@\x00@${d}@g"  -e "s@^@${1}: @" ;;
        *)    sed -e "s@\x00@${d}@g"  ;;
        esac
    )
    shift
done

1
(1) แม้ว่าสิ่งนี้อาจแก้ปัญหาได้ แต่เราต้องการคำตอบที่จะมีคำอธิบายเพิ่มเติมอีกเล็กน้อย ตัวอย่างเช่นมีเหตุผลจริงที่จะพูดd="${1}"แทนที่จะเป็นเพียงแค่d="$1"? (2) คุณต้องขยายคำเตือนของคุณ: หากใช้กับไฟล์หลายไฟล์คุณจะพบปัญหาหากชื่อไฟล์ใด ๆ มี '@' อยู่ (3) (Nit pick) การเปลี่ยน / จำลองแบบ "grep" ที่แท้จริงจะทำงานกับศูนย์ไฟล์ได้
Scott


0

เป็นไงบ้าง การใช้งานใด ๆ

ไฟล์ grep "search-string" | awk 'BEGIN {RS = "\ n"; ORS = "@"} {พิมพ์}'

ตั้งค่า '@' ให้เหมาะกับความต้องการของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.