จะหนี single quote ใน sed ได้อย่างไร?


92

จะหลีกหนีคำพูดเดียวในนิพจน์ sed ที่ล้อมรอบด้วยเครื่องหมายคำพูด

ตัวอย่างเช่น:

sed 's/ones/one's/' <<< 'ones thing'


1
คำตอบสั้น ๆ คือ " คุณทำอย่างนั้นไม่ได้ " - วิธีแก้ปัญหาที่นำเสนอทั้งหมดทำงานได้ดี
glenn jackman

คำตอบ:


151

sedรหัสใบเสนอราคาพร้อมคำพูดคู่:

    $ sed "s/ones/one's/"<<<"ones thing"   
    one's thing

ฉันไม่ชอบหนีรหัสด้วยแบ็กสแลชนับร้อย - เจ็บตา โดยปกติฉันทำในลักษณะนี้:

    $ sed 's/ones/one\x27s/'<<<"ones thing"
    one's thing

7
ดูเหมือนจะใช้ไม่ได้กับsed -iเหตุผลใดเป็นพิเศษ?
SamAko

ควรสังเกตว่าคำสั่ง sed โดยรอบที่มีเครื่องหมายอัญประกาศคู่ช่วยให้คำสั่งเหล่านั้นถูกสอดแทรกโดยเชลล์และอาจนำไปสู่ปัญหาที่คาดไม่ถึง
potong

38

เคล็ดลับอย่างหนึ่งคือการใช้การต่อสตริงเชลล์ของสตริงที่อยู่ติดกันและหลีกเลี่ยงเครื่องหมายคำพูดที่ฝังไว้โดยใช้การหลบหนีของเชลล์:

sed 's/ones/two'\''s/' <<< 'ones thing'

two's thing

มี 3 สตริงในนิพจน์ sed ซึ่งเชลล์จะต่อเข้าด้วยกัน:

sed 's/ones/two'

\'

's/'

หวังว่าจะช่วยคนอื่น!


อาจจะเป็นตัวแปรที่ง่ายกว่า: sed 's / ones / two''s /' <<< 'ones thing'
gregory

@gregory: ไม่มีที่เอาท์พุทsed 's/ones/two''s/' <<< 'ones thing' twos thingไม่มี'ในเอาต์พุต คุณต้องทำตามที่อธิบายไว้ในคำตอบนี้
wisbucky

@wisbucky ด้วยเวอร์ชันของ sed ที่ฉันใช้ (FreeBSD / macOS) บน zsh จะให้ผลลัพธ์เป็น "สองสิ่ง" อย่างแน่นอน
gregory

ผู้ช่วยที่ดีโดยแจ้งให้เราทราบเปลือกแล้วเย็บเข้าด้วยกัน
Prateek Gupta

7

วิธีที่ดีที่สุดคือการใช้ $'some string with \' quotes \''

เช่น:

sed $'s/ones/two\'s/' <<< 'ones thing'

3
C-style $'string'เป็นแบบBash โดยเฉพาะดังนั้นจึงไม่สามารถพกพาไปยัง POSIX shell ได้
tripleee

มันไม่bashเฉพาะเจาะจง นอกจากนี้ยังมีให้ใช้งานในkshและzshแต่ใช่มันเป็นส่วนขยายของ POSIX ซึ่งใช้ได้ดีถ้าคุณไม่ได้เขียนสคริปต์แบบพกพา ข้อเสียเพียงอย่างเดียวคือคุณต้องหลีกเลี่ยงแบ็กสแลชอื่น ๆ ที่คุณใช้เช่นกัน
dannyw

6

เพียงใช้เครื่องหมายคำพูดคู่ที่ด้านนอกของคำสั่ง sed

$ sed "s/ones/one's/" <<< 'ones thing'
one's thing

มันใช้งานได้กับไฟล์ด้วย

$ echo 'ones thing' > testfile
$ sed -i "s/ones/one's/" testfile
$ cat testfile
one's thing

หากคุณมีเครื่องหมายคำพูดเดี่ยวและคู่ในสตริงก็ใช้ได้เช่นกัน เพียงแค่หลีกหนีเครื่องหมายคำพูดคู่

ตัวอย่างเช่นไฟล์นี้มีสตริงที่มีทั้งเครื่องหมายคำพูดเดี่ยวและคู่ ฉันจะใช้ sed เพื่อเพิ่มอัญประกาศและลบเครื่องหมายคำพูดคู่ออก

$ cat testfile
"it's more than ones thing"
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile 
$ cat testfile 
it's more than one's thing

ขอบคุณ! ฉันรัก regex รัก sed และตอนนี้ฉันรักคุณ <3
Gabriel A. Zorrilla

3

นี้เป็นชนิดของไร้สาระ แต่ฉันไม่สามารถได้รับ\'ในsed 's/ones/one\'s/'การทำงาน ฉันกำลังมองหาสิ่งนี้เพื่อสร้างเชลล์สคริปต์ที่จะเพิ่มลงimport 'hammerjs';ในsrc/main.tsไฟล์ของฉันโดยอัตโนมัติด้วย Angular

สิ่งที่ฉันได้ทำงานคือ:

apost=\'
sed -i '' '/environments/a\
import '$apost'hammerjs'$apost';' src/main.ts

ดังนั้นสำหรับตัวอย่างข้างต้นมันจะเป็น:

apost=\'
sed 's/ones/one'$apost's/'

ฉันไม่รู้ว่าทำไมถึง\'ไม่ทำงานด้วยตัวเอง แต่มีอยู่



0

ฉันรู้ว่านี่จะฟังดูเหมือนตำรวจ แต่ฉันไม่สามารถทำงานได้เลยเมื่อมีทั้งเครื่องหมายคำพูดเดี่ยวและคู่ในสตริง เพื่อช่วยมือใหม่อย่างฉันที่กำลังมีปัญหาทางเลือกหนึ่งคือการแยกสตริง ฉันต้องแทนที่โค้ดในไฟล์ index.hmtl มากกว่า 100 ไฟล์ สตริงมีทั้งคำพูดเดี่ยวและคู่ดังนั้นฉันเพิ่งแยกสตริงและแทนที่บล็อกแรกกับ บล็อกที่สองกับ<!-- -->มันทำให้ไฟล์ index.html ของฉันยุ่ง แต่มันใช้งานได้


0

การหลบหนีบางอย่างบนเทอร์มินัล AppleMacOSX ล้มเหลว:

sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'


0

ใช้ตัวแยกสตริงทางเลือกเช่น ":" เพื่อหลีกเลี่ยงความสับสนกับเครื่องหมายทับที่แตกต่างกัน

sed "s:ones:one's:" <<< 'ones thing'

หรือหากคุณต้องการยกระดับคำพูดเดียว

sed "s:ones:one\'s:" <<< 'ones thing'

ทั้งสองกลับ

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