คำถามติดแท็ก sed

"sed" ("stream editor") เป็นยูทิลิตี Unix ที่แยกวิเคราะห์และแปลงไฟล์ข้อความ

1
ลบบรรทัดแรกออกจากไฟล์ Unicode html
ฉันมีไฟล์ HTML ที่อยู่ในรูปแบบ UTF-8 และฉันต้องการลบห้าบรรทัดแรกออกจากมัน ฉันได้ลองใช้sedแต่มันไม่ทำงานในกรณีนี้: sed "1,5d" Result.html>small2 ใช้งานได้กับไฟล์อื่น แต่ไม่ได้อยู่ที่นี่ ฉันไม่สามารถใช้tailเพราะลบออกจากจุดสิ้นสุดของไฟล์และเว็บไซต์อาจมีการเปลี่ยนแปลงในภายหลัง นี่คือไฟล์ของฉัน HTTP/1.1 200 OK Cache-Control: private Content-Length: 176073 Content-Type: text/html; charset=utf-8 Server: Microsoft-IIS/7.5 X-AspNet-Version: 4.0.30319 Set-Cookie: ASP.NET_SessionId=jaq52r5vsd04zvffokbutu1q; path=/; HttpOnly X-Powered-By: ASP.NET Date: Thu, 29 Nov 2012 06:41:59 GMT Connection: close <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> …
2 linux  sed  text-editing  awk  tail 

2
แทรกสตริงระหว่างสองรูปแบบ
ฉันต้องการเปลี่ยนไฟล์ด้วยชื่อเช่น: d1-a2_A1_B1.txt abcd_A90_B2.txt ที่ฉันต้องการแทรก_FOOระหว่างแรก_A[0-9]\+และ_B[0-9]เพื่อให้ชื่อไฟล์ d1-a2_A1_FOO_B1.txt abcd_A90_FOO_B2.txt แต่การแสดงออกปกติของฉันไม่ทำงาน: for f in $(ls); do mv $f \`echo $f | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/\`; done ฉันลองด้วยสายเดี่ยว: echo abcd_A90_B2.txt | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/ ตกลง: สิ่งนี้ได้ผล: echo abcd_A90_B2.txt | sed -e 's/\(_A[0-9]\+\)\(_B[0-9]\)/\1_FOO\2/'
2 linux  bash  regex  sed 

2
วิธีการพิมพ์แบบ sed ถึงจุดสิ้นสุดของบรรทัดจาก socat
ฉันมีเซิร์ฟเวอร์ที่ส่งข้อมูลในการออกอากาศ UDP บนพอร์ต 1,0552 ข้อมูลคือ 7 ตัวเลขคั่นด้วยเครื่องหมายจุลภาคดังนั้น 5.351204,0.001968,-0.000473,-0.999222,0.000451,0.001455,1.084310 ฉันดึงข้อมูลนี้ด้วย socat -u udp-recv:10552,reuseaddr - ฉันต้องการเปลี่ยนรูปแบบของข้อมูลนี้ดังนั้นฉันจะทำให้เป็นข้อมูล ฉันไม่สนใจหมายเลขแรกดังนั้นฉันจึงลบออกด้วย s/[^,]*,//; ฉันเพิ่มช่องว่างหลังเครื่องหมายจุลภาคด้วย s/,/, /g ฉันจะเพิ่มวงเล็บเปิดไว้ที่จุดเริ่มต้นของแต่ละบรรทัดด้วย s/^/(/ ในที่สุดฉันพยายามที่จะเพิ่มวงเล็บปิดลงที่ท้ายบรรทัดแต่ละบรรทัดด้วย s/$/)/ คำสั่งสุดท้ายกลายเป็น socat -u udp-recv:10552,reuseaddr - | sed 's/[^,]*,//;s/,/, /g;s/^/(/;s/$/)/' ทุกอย่างทำงานได้ตามที่คาดไว้ยกเว้นวงเล็บปิดสุดท้ายจะปรากฏขึ้นที่จุดเริ่มต้นของแต่ละบรรทัดดังนั้นจึงดูเหมือน )0.051727, -0.595779, -0.794678, 0.082047, 0.644327, -0.027242 การลบบิตสุดท้ายของคำสั่งสำหรับ socat -u udp-recv:10552,reuseaddr - | sed 's/[^,]*,//;s/,/, /g;s/^/(/;' ผลลัพธ์ใน (0.079330, …
1 macos  bash  sed  socat 


1
วิธีการแยกเซกเมนต์ของไฟล์ไบนารีโดยยึดตามการเริ่มต้นและสิ้นสุดสตริงสตริง
ฉันมีไฟล์ไบนารีขนาดใหญ่ (หลายร้อย GB) และฉันต้องการแยกกลุ่มจากมัน ฉันรู้ว่าสตริงเลขฐานสิบหกของจุดเริ่มต้นและจุดสิ้นสุด
1 grep  sed  awk  hexdump 

2
รันคำสั่ง sed โดยไม่ตั้งใจตัวเลือกที่ไม่รู้จักเพื่อ `s 'หมายถึงไม่มีการทดแทนเกิดขึ้น
ฉันเผลอรันคำสั่ง sed: find ./ -type f -exec sed -i 's/http:\/\/i.po.st\/static\/v3\/img\/set-24.png/https:\/\/i.po.st\/static/v3/img/set-24.png/gI' {} \; ก่อนที่ฉันจะหลบหนี / มันผิดพลาด: sed: -e expression #1, char 75: unknown option to `s' sed: -e expression #1, char 75: unknown option to `s' ดังนั้นจึงไม่มีการทดแทนแปลก ๆ เกิดขึ้นใช่ไหม
1 linux  bash  sed 

1
sed + ไม่ทำงานบน solaris
ฉันพยายามใช้sedสายกับ+เครื่อง Solaris และบนเครื่อง Linux บน Solaris sed ไม่ได้ลบสตริงจนกว่าจำนวนแรกเช่นฉันต้องการ: solaris:/ ROOT > echo "Release............5.3.7.1-12" | sed 's/[^0-9]\+//' Release............5.3.7.1-12 บน Linux ฉันได้รับผลลัพธ์ที่คาดหวัง: linux tmp]# echo "Linux Release............5.3.7.1-12" | sed 's/[^0-9]\+//' 5.3.7.1-12 ทำไมรูปแบบ sed นี้ไม่ทำงานบนโซลาริส? ฉันต้องเปลี่ยนแปลงอะไรบ้างในไวยากรณ์เพื่อให้สามารถทำงานบน Solaris ได้
1 regex  sed  solaris 

0
sed ล้มเหลวในการจับคู่เครื่องหมายเท่ากับ
มันใช้งานได้: $ sudo gitlab-runner list 2>&1 | grep 'Token' | sed -e 's/Token//' Python 2.7.14 Executor=docker =bccdbf31ef6bc74b2ae4980d8eccea URL=http://something Docker Executor=docker =5b06f034f48d3543848d7d209ce80c URL=http://something Ansible Executor=docker =e2215647f2c9981c8d74abaf324983 URL=http://something สิ่งนี้ไม่ทำงาน: $ sudo gitlab-runner list 2>&1 | grep 'Token' | sed -e 's/Token=//' Python 2.7.14 Executor=docker Token=bccdbf31ef6bc74b2ae4980d8eccea URL=http://something Docker Executor=docker Token=5b06f034f48d3543848d7d209ce80c URL=http://something Ansible Executor=docker …
1 linux  ubuntu  sed 

2
กรองอินพุตด้วย sed (regex)
ฉันมีปัญหากับ sed ไม่ได้คืนสิ่งที่ฉันคาดหวังเมื่อใช้รูปแบบ regex เพื่อล้างผลลัพธ์บางอย่างจากแบบสอบถาม mysql mysql -uroot -p -e 'SELECT `path` FROM db.media_gallery' | sed -n -r 's/[^\/]+([^\s]+).*/\1/p' แบบสอบถามส่งคืนกลุ่มของแถวเช่น: | /media/M/W/lmt_MWS04_8.png | | /media/M/W/lmt_MWS02_11.png | เมื่อฉันไพพ์ผ่านคำสั่ง sed ที่ระบุไว้ด้านบนมันจะส่งคืนสิ่งนี้: //M/W/lmt_MWS04_8.png //M/W/lmt_MWS02_11.png "สื่อ" ไปไหน เหตุใดจึงลบส่วนของสตริงของฉันแบบสุ่ม ไม่มีใครรู้วิธีแก้ไข regex ของฉันหรือไม่
1 linux  bash  regex  sed 

1
sed / awk: แก้ไขไฟล์ต้นฉบับหรือไม่
ฉันพยายามเขียนสคริปต์การเปลี่ยนแปลงบางอย่างที่ฉันต้องทำกับไฟล์ config สองสามตัว เป็นมูลค่าการกล่าวขวัญว่าฉันเป็นผู้เชี่ยวชาญที่มีทั้ง sed และ awk แม้ว่าฉันจะดีกว่ากับ sed ตอนนี้ฉันกำลังทำ: sed '/setting.name/c setting.name: newvalue' </etc/foo.conf >tmpfile.tmp && mv tmpfile.tmp /etc/foo.conf แต่แน่นอนว่ามีวิธีที่ดีกว่า บางทีด้วย awk?
1 sed  awk 

2
หยิบส่วนหนึ่งจากไฟล์ขนาดใหญ่ระหว่างสองสตริงย่อยที่รู้จักกันโดยใช้ sed?
ฉันมีไฟล์ XML ที่ค่อนข้างใหญ่โดยไม่มีการแบ่งบรรทัด มันใหญ่มากมันช้าที่จะเปิดและทำงานใน Emacs หรือโปรแกรมแก้ไขข้อความอื่น ๆ แต่ฉันแค่ต้องการแยกส่วนที่ขาดหายไปของมันระหว่างสองสตริงย่อยที่รู้จัก ฉันไม่สนใจที่จะรักษาโครงสร้าง XML ไว้ฉันแค่อยากได้ตัวละคร นี่น่าจะเป็นสายการบินเดียวที่ใช่ไหม? ความคิดใด ๆ วิธีการทำเช่นนี้? ฉันพยายามปรับhttps://stackoverflow.com/questions/13242469/how-to-use-sed-grep-to-extract-text-between-two-wordsแต่ดูเหมือนจะไม่ทำงานเมื่อฉันไปที่ไฟล์ของฉันเป็น มัน. (มันใช้ได้กับตัวอย่างของเล่น แต่ฉันคิดว่าไฟล์ของฉันอาจใหญ่เกินไป)
1 bash  sed 

3
แยกและลบส่วนของสตริงระหว่างตัวคั่น
ฉันต้องการผ่านไฟล์และลบลำดับบางอย่างระหว่างตัวคั่น ตัวอย่างเช่น drw---- 00000000 11111111 0 ./a/ drw---- 00000000 11111111 0 ./b/ d------ 00000000 11111111 0 ./c/ d------ 00000000 11111111 0 ./d/k/ d------ 00000000 11111111 0 ./e/l/r/ d------ 00000000 11111111 0 ./f/m/s/x/ ------- 00000000 11111111 89 ./g/n/t/y/C.xml dr----- 00000000 11111111 0 ./h/o/u/z/ dr-r--- 00000000 11111111 0 ./i/p/v/A/D/ d--r--- 00000000 11111111 …
1 shell  cygwin  regex  sed 

1
SED / AWK / PERL (ผู้ใช้ GNU) - วิธีแทนที่รูปแบบ A แต่ไม่ใช่รูปแบบ B
ก่อนอื่นฉันใช้ GNU userland เพื่อให้คุณสามารถสมมติว่าฉันใช้ Bash, GNU coreutils ... ฉันมี HTML และฉันต้องการเปลี่ยนแปลงทั้งหมด href="foobarz" เข้าไป href="" อย่างไรก็ตามฉันไม่ต้องการเปลี่ยนบรรทัดที่มีคำว่าcss(ไม่ต้องตรงตามตัวพิมพ์ใหญ่ - เล็ก) 'href="fooCsSbarz"' ควรยังคงไม่เปลี่ยนแปลง ฉันกำลังใช้คำสั่ง $ cat foo.html | sed -e 's/href="[^"]*"/href=""/g' > bar.html แต่ไม่สามารถเก็บบรรทัดเหล่านั้นที่มีคำว่าcss(ไม่คำนึงถึงตัวอักษรพิมพ์เล็กและใหญ่) จริงๆแล้วยินดีต้อนรับเครื่องมือใด ๆ ที่มีใน * nix เช่น sed, awk, perl ... ขอบคุณสำหรับความช่วยเหลือของคุณ!
1 sed  perl  awk  gnu 

2
ฉันจะสร้างบรรทัดคำสั่ง sed จาก diff ได้อย่างไร
ฉันรู้ว่า diff -e สามารถส่งออก ed ต้นฉบับ และความเข้าใจของฉันก็คือ ed และ sed แบ่งปันวิธีการของพวกเขา แต่ที่ ed เป็นแบบโต้ตอบและ sed สำหรับสตรีม สิ่งที่ฉันต้องการจะทำคือเอาท์พุทของ diff -e (หรือการเชิญอื่น ๆ ของ diff ) และลบล้างมันเป็นการร้องขอ sed เช่นการเรียกใช้คำสั่งนั้นด้วยไฟล์ "before" ดั้งเดิมเมื่ออินพุตสร้างเอาต์พุตเทียบเท่ากับไฟล์ "after" จาก diff การภาวนา ฉันต้องการจัดรูปแบบคำสั่งเป็นชุดของ -e <BLERG> ตัวเลือกที่ส่งไปยัง sed เพื่อหลีกเลี่ยงการต้องเขียนสคริปต์ ed / sed ไปยังไฟล์อื่น ฉันลองชุด mungings ที่เห็นได้ชัด แต่ฉันไม่ได้รับผลลัพธ์ที่ต้องการ (หรือดูสมเหตุสมผล) และฉันคิดว่าฉันขาดอะไรบางอย่างที่ครอบคลุม เป็นไปได้ไหม

1
ที่อยู่ IP ระบุทศนิยมเป็น / 8 หรือ / 16 โดยใช้เครื่องหมาย bash, sed หรือ awk?
ฉันมีไฟล์อินพุตที่มีรายการที่อยู่ ip และ ip_counts (พารามิเตอร์บางตัวที่ฉันใช้ภายใน) ไฟล์มีลักษณะดังนี้ 202.124.127.26 2135869 202.124.127.25 2111217 202.124.127.17 2058082 202.124.127.16 2014958 202.124.127.20 1949323 202.124.127.24 1933773 202.124.127.27 1932076 202.124.127.22 1886466 202.124.127.18 1882955 202.124.127.21 1803528 202.124.127.23 1786348 119.224.129.200 1776592 119.224.129.211 1639325 202.124.127.19 1479198 119.224.129.201 1145426 202.49.175.110 1133354 119.224.129.210 1119525 68.232.45.132 1085491 119.224.129.209 1015078 131.203.3.8 857951 202.162.73.4 817197 207.123.58.125 785326 …

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