จะหลีกหนีคำพูดเดียวในนิพจน์ sed ที่ล้อมรอบด้วยเครื่องหมายคำพูด
ตัวอย่างเช่น:
sed 's/ones/one's/' <<< 'ones thing'
จะหลีกหนีคำพูดเดียวในนิพจน์ sed ที่ล้อมรอบด้วยเครื่องหมายคำพูด
ตัวอย่างเช่น:
sed 's/ones/one's/' <<< 'ones thing'
คำตอบ:
sed
รหัสใบเสนอราคาพร้อมคำพูดคู่:
$ sed "s/ones/one's/"<<<"ones thing"
one's thing
ฉันไม่ชอบหนีรหัสด้วยแบ็กสแลชนับร้อย - เจ็บตา โดยปกติฉันทำในลักษณะนี้:
$ sed 's/ones/one\x27s/'<<<"ones thing"
one's thing
sed -i
เหตุผลใดเป็นพิเศษ?
เคล็ดลับอย่างหนึ่งคือการใช้การต่อสตริงเชลล์ของสตริงที่อยู่ติดกันและหลีกเลี่ยงเครื่องหมายคำพูดที่ฝังไว้โดยใช้การหลบหนีของเชลล์:
sed 's/ones/two'\''s/' <<< 'ones thing'
two's thing
มี 3 สตริงในนิพจน์ sed ซึ่งเชลล์จะต่อเข้าด้วยกัน:
sed 's/ones/two'
\'
's/'
หวังว่าจะช่วยคนอื่น!
sed 's/ones/two''s/' <<< 'ones thing'
twos thing
ไม่มี'
ในเอาต์พุต คุณต้องทำตามที่อธิบายไว้ในคำตอบนี้
วิธีที่ดีที่สุดคือการใช้ $'some string with \' quotes \''
เช่น:
sed $'s/ones/two\'s/' <<< 'ones thing'
$'string'
เป็นแบบBash โดยเฉพาะดังนั้นจึงไม่สามารถพกพาไปยัง POSIX shell ได้
bash
เฉพาะเจาะจง นอกจากนี้ยังมีให้ใช้งานในksh
และzsh
แต่ใช่มันเป็นส่วนขยายของ POSIX ซึ่งใช้ได้ดีถ้าคุณไม่ได้เขียนสคริปต์แบบพกพา ข้อเสียเพียงอย่างเดียวคือคุณต้องหลีกเลี่ยงแบ็กสแลชอื่น ๆ ที่คุณใช้เช่นกัน
เพียงใช้เครื่องหมายคำพูดคู่ที่ด้านนอกของคำสั่ง 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
นี้เป็นชนิดของไร้สาระ แต่ฉันไม่สามารถได้รับ\'
ใน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/'
ฉันไม่รู้ว่าทำไมถึง\'
ไม่ทำงานด้วยตัวเอง แต่มีอยู่
ฉันรู้ว่านี่จะฟังดูเหมือนตำรวจ แต่ฉันไม่สามารถทำงานได้เลยเมื่อมีทั้งเครื่องหมายคำพูดเดี่ยวและคู่ในสตริง เพื่อช่วยมือใหม่อย่างฉันที่กำลังมีปัญหาทางเลือกหนึ่งคือการแยกสตริง ฉันต้องแทนที่โค้ดในไฟล์ index.hmtl มากกว่า 100 ไฟล์ สตริงมีทั้งคำพูดเดี่ยวและคู่ดังนั้นฉันเพิ่งแยกสตริงและแทนที่บล็อกแรกกับ
บล็อกที่สองกับ<!--
-->
มันทำให้ไฟล์ index.html ของฉันยุ่ง แต่มันใช้งานได้
การหลบหนีบางอย่างบนเทอร์มินัล AppleMacOSX ล้มเหลว:
sed 's|ones|one'$(echo -e "\x27")'s|1' <<<'ones thing'
ใช้ตัวแยกสตริงทางเลือกเช่น ":" เพื่อหลีกเลี่ยงความสับสนกับเครื่องหมายทับที่แตกต่างกัน
sed "s:ones:one's:" <<< 'ones thing'
หรือหากคุณต้องการยกระดับคำพูดเดียว
sed "s:ones:one\'s:" <<< 'ones thing'
ทั้งสองกลับ
one's thing