วิธีการแยกนิพจน์แบบยาวเป็นหลายบรรทัด


15
sed 's/[long1][long2]/[long3][long4]/' file.txt

ฉันต้องการแยกคำสั่งนี้ออกเป็นหลายบรรทัด - fx บางอย่างเช่นนี้:

sed 's/
    [long1]
    [long2]
  /
    [long3]
    [long4]
  /' file.txt

การใช้\หรือแยกสตริงไม่ทำงาน



นั่นเป็นเหตุผลที่ Perl มี/xตัวดัดแปลงให้ทดแทน
choroba

1
@ เครือข่าย: ใช่ขอบคุณฉันเพิ่มคำตอบของฉันที่นั่นด้วย
Raffael

คำตอบ:


8

คุณสามารถบันทึกสตริงแบบยาวเพื่อตัวแปรตัวแปรจากนั้นใช้ในsedคำสั่ง:

string=[long1][long2]
replace= [long3][long4]
sed -e 's/'"$string"'/'"$replace"'/' file

หากคุณสามารถใช้perlคุณสามารถแบ่งรูปแบบยาวด้วยxตัวแก้ไข:

perl -e 's/
[long1]
[long2]
/[long3][long4]/x' file

1
ทำไมคุณใช้คำพูดมากมาย sed "s/$string/$replace/" file.txtไม่เป็นไร
สกอตต์

1
replace=นอกจากนี้แน่นอนคุณจะต้องลบพื้นที่หลัง
สกอตต์

8
sed 's'/\
'[long1]'\
'[long2]'\
'/'\
'[long3]'\
'[long4]'\
'/' file.txt

การแยกหลายบรรทัดด้วยแบ็กสแลชจะใช้งานได้หากไม่มีการเยื้องบรรทัดใหม่

$ echo "a,b" | sed 's/\(.'\
> '\),\(.\)/\2-\1/'
b-a

ทดสอบกับ Cygwin ด้วย GNU sed 4.2.2


รุ่น sed ของคุณคืออะไร? ฉันทดสอบด้วยGNU sed version 4.2.1และมันไม่ทำงาน
cuonglm

2
ดูเหมือนว่ามีเครื่องหมายแบ็กสแลชหายไปที่ส่วนท้ายของบรรทัดแรก
Volker Siegel

7

อีกแง่มุม:

วิธีการบำรุงรักษาเป็น[long]รายการด้านบน?

ยิ่งสั้นและชัดเจนยิ่งขึ้นคุณสามารถรักษาอนุประโยคได้ง่ายขึ้นพวกเขาจะสามารถเปลี่ยนแปลงและปรับปรุงได้ง่ายขึ้นเมื่อเวลาผ่านไปและข้อเท็จจริง (ภายนอกภายนอก) เปลี่ยนไปรอบ ๆ ฟังก์ชันที่พวกเขามีให้

เช่น

ใจ \
-e 's / [minimal-s1] / [minimal-r1] /' \
-e 's / [minimal-s2] / [minimal-r2] /' \
-e 's / [minimal-s3] / [minimal-r3] /' \
-e 's / [minimal-s4] / [minimal-r4] /' 

... อาจเป็นสิ่งที่ต้องพยายามและชอบ


4

นอกจากนี้คุณยังสามารถทำลายมันด้วยวิธีนี้:

sed '/[long1][long2]/
    s//[long3][long4]/'

หรืออาจจะชอบ:

sed "$(
    printf 's/[%s][%s]/[%s][%s]/' \
        long1 \
        long2 \
        long3 \
        long4
)"

หรือด้วย heredoc:

sed -f - <<SED file.txt
s/\
[long1]\
[long2]\
/\
[long3]\
[long4]\
/
SED
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.