วิธีหนึ่งจะแปลง 4 ช่องว่างเป็น 2 ช่องว่างด้วยsed? เป็นไปได้ไหม?
ฉันพบสิ่งนี้ แต่มันแปลงแท็บเป็นช่องว่าง:
sed -r ':f; s|^(\t*)\s{4}|\1\t|g; t f' file
วิธีหนึ่งจะแปลง 4 ช่องว่างเป็น 2 ช่องว่างด้วยsed? เป็นไปได้ไหม?
ฉันพบสิ่งนี้ แต่มันแปลงแท็บเป็นช่องว่าง:
sed -r ':f; s|^(\t*)\s{4}|\1\t|g; t f' file
คำตอบ:
สคริปต์ที่คุณโพสต์จะแปลงช่องว่าง 4 * n เป็นแท็บเฉพาะเมื่อช่องว่างนั้นนำหน้าด้วยแท็บเท่านั้น
หากคุณต้องการแทนที่ 4 ช่องว่างด้วย 2 ช่องว่าง แต่เป็นการเว้นย่อหน้าเท่านั้นในขณะที่เป็นไปได้ที่จะทำด้วย sed ฉันแนะนำ Perl แทน
perl -pe 's{^((?: {4})*)}{" " x (2*length($1)/4)}e' file
ใน sed:
sed -e 's/^/~/' -e ': r' -e 's/^\( *\)~ /\1 ~/' -e 't r' -e 's/~//' file
คุณอาจต้องการใช้indentแทน
วิธีการตรงไปตรงมาใช้ไม่ได้:
sed -r 's/ {4}/ /g'
ถ้าไม่โพสต์อินพุตที่มันล้มเหลว
หากมีการแปลงเฉพาะพื้นที่นำหน้า:
sed 'h;s/[^ ].*//;s/ / /g;G;s/\n *//'
ด้วยความคิดเห็น:
sed '
h; # save a copy of the pattern space (filled with the current line)
# onto the hold space
s/[^ ].*//; # remove everything starting with the first non-space
# from the pattern space. That leaves the leading space
# characters
s/ / /g; # substitute every sequence of 4 spaces with 2.
G; # append a newline and the hold space (the saved original line) to
# the pattern space.
s/\n *//; # remove that newline and the indentation of the original
# line that follows it'
ดูการ'ts'ตั้งค่าและ:retabคำสั่งของกลุ่ม
'ts'และ:retabไม่ใช่คำตอบสำหรับคำถาม แต่เกี่ยวข้องและอาจช่วยแก้ไขเป้าหมายโดยรวมของคุณ คุณสามารถทำอะไรvim -- *.c, :set ts=...แล้วหรือ:argdo retab :argdo retab!ดูเพิ่มเติม'sw'ตัวเลือกและความสามารถในการเยื้องของตัวเองเป็นกลุ่ม
sed 's/^\( \+\)\1\1\1/\1\1/' file
มันทำงานได้โดยการแบ่งช่องว่างนำออกเป็นสี่อินสแตนซ์ของกลุ่มเดียวกัน (ดังนั้นพวกมันจึงเท่ากันทั้งหมด) จากนั้นแทนที่ด้วยช่องว่างอินสแตนซ์สองกลุ่ม
\+) ขอขอบคุณ.
sed 's/ \{2,4\}\( \{0,1\}[^ ].*\)*/ \1/g' <input
นั่นควรบีบลำดับชั้นนำของช่องว่างเท่านั้น
Nested quantifiers in regex; marked by <-- HERE in m/^( {4}* <-- HERE )/ at -e line 1.