แทนที่ช่องว่างด้วยแท็บใน linux


100

ฉันจะแทนที่ช่องว่างด้วยแท็บใน linux ในไฟล์ข้อความที่กำหนดได้อย่างไร

คำตอบ:


169

ใช้โปรแกรม unexpand (1)


UNEXPAND(1)                      User Commands                     UNEXPAND(1)

NAME
       unexpand - convert spaces to tabs

SYNOPSIS
       unexpand [OPTION]... [FILE]...

DESCRIPTION
       Convert  blanks in each FILE to tabs, writing to standard output.  With
       no FILE, or when FILE is -, read standard input.

       Mandatory arguments to long options are  mandatory  for  short  options
       too.

       -a, --all
              convert all blanks, instead of just initial blanks

       --first-only
              convert only leading sequences of blanks (overrides -a)

       -t, --tabs=N
              have tabs N characters apart instead of 8 (enables -a)

       -t, --tabs=LIST
              use comma separated LIST of tab positions (enables -a)

       --help display this help and exit

       --version
              output version information and exit
. . .
STANDARDS
       The expand and unexpand utilities conform to IEEE Std 1003.1-2001
       (``POSIX.1'').

4
ว้าวไม่เคยรู้เลยว่ามีการขยาย / ไม่ขยายออกไป ผมพยายามที่จะทำตรงข้ามและขยายเป็นที่สมบูรณ์แบบแทนที่จะต้องยุ่ง ๆ กับหรือtr sed
Ibrahim

4
สำหรับบันทึกที่ขยาย / unexpand มีสาธารณูปโภคมาตรฐาน
kojiro

4
เจ๋งมากที่เป็นมาตรฐาน ฉันรักปรัชญา UNIX จะดีมากถ้ามันสามารถทำได้
Matthew Flaschen

3
ฉันไม่คิดว่า unexpand จะใช้ได้ที่นี่ .. มันแปลงเฉพาะช่องว่างนำหน้าและมีช่องว่างสองช่องขึ้นไปเท่านั้น .. ดูที่นี่: lists.gnu.org/archive/html/bug-textutils/2001-01/msg00025.html
olala

13
ข้อควรระวัง - การยกเลิกการขยายจะไม่แปลงช่องว่างเดียวเป็นแท็บ หากคุณต้องการแปลงอักขระ 0x20 ทั้งหมดแบบสุ่มสี่สุ่มห้าให้เป็นแท็บเดียวคุณต้องมีเครื่องมืออื่น
Steve S.

44

ฉันคิดว่าคุณสามารถลองด้วย awk

awk -v OFS="\t" '$1=$1' file1

หรือ SED หากคุณต้องการ

sed 's/[:blank:]+/,/g' thefile.txt > the_modified_copy.txt

หรือแม้กระทั่ง tr

tr -s '\t' < thefile.txt | tr '\t' ' ' > the_modified_copy.txt

หรือเวอร์ชันที่เรียบง่ายของโซลูชัน tr ที่แซมบิสบีเสนอ

tr ' ' \\t < someFile > someFile

4
ในตัวอย่าง sed ของคุณแนวทางปฏิบัติที่ดีที่สุดกำหนดให้คุณใช้ tr เพื่อแทนที่อักขระเดี่ยวบน sed ด้วยเหตุผลด้านประสิทธิภาพ / ความเร็ว นอกจากนี้ตัวอย่าง tr ยังง่ายกว่ามากด้วยวิธีนี้:tr ' ' \\t < someFile > someFile
Sam Bisbee

2
แน่นอนว่า tr มีประสิทธิภาพที่ดีกว่า sed แต่เหตุผลหลักที่ฉันรัก Unix คือมีหลายวิธีในการทำบางสิ่ง หากคุณวางแผนที่จะทำการทดแทนหลาย ๆ ครั้งคุณจะค้นหาโซลูชันที่มีประสิทธิภาพที่ดี แต่ถ้าคุณจะทำเพียงครั้งเดียวคุณจะค้นหาโซลูชันที่เกี่ยวข้องกับคำสั่งที่ทำให้คุณรู้สึกสบายใจ
Jonathan

2
อาร์กิวเมนต์ ฉันต้องใช้การลองผิดลองถูกเพื่อให้งานง่ายขึ้น ฉันไม่รู้ว่าทำไมฉันต้องหนีเครื่องหมายบวกแบบนี้ls -l | sed "s/ \+/ /g"
Jess

ด้วยawk -v OFS="\t" '$1=$1' file1ฉันสังเกตเห็นว่าถ้าคุณมีบรรทัดที่ขึ้นต้นด้วยหมายเลข 0 (เช่น0 1 2) บรรทัดจะถูกกำหนดจากผลลัพธ์
Nikola Novak

@Jess คุณพบ regex "ไวยากรณ์เริ่มต้นที่ถูกต้อง" โดยค่าเริ่มต้น sed ถือว่าเครื่องหมายบวก single (ไม่ใช้ค่า Escape) เป็นอักขระธรรมดา เดียวกันเป็นจริงสำหรับบางตัวละครอื่น ๆ ชอบ ... คุณสามารถหาข้อมูลเพิ่มเติมได้ที่นี่ '?': gnu.org/software/sed/manual/html_node/... รายละเอียดไวยากรณ์ที่คล้ายกันสามารถพบได้ที่นี่ (หมายเหตุว่านี่คือคนสำหรับ grep ไม่ sed): gnu.org/software/grep/manual/grep.html#Basic-vs-Extended
Victor Yarema

13

การใช้ Perl :

perl -p -i -e 's/ /\t/g' file.txt

3
มีปัญหาคล้ายกันกับการแทนที่ช่องว่างติดต่อกันด้วยแท็บเดียว Perl ทำงานได้โดยการเพิ่ม '+' ลงใน regexp เท่านั้น
ทอดด์

แน่นอนว่าฉันต้องการทำสิ่งที่ตรงกันข้าม: แปลงแท็บเป็นสองช่องว่าง:perl -p -i -e 's/\t/ /g' *.java
TimP

ฉันสามารถทำซ้ำได้หรือไม่?
Aaron Franke

นี่เป็นตัวแปรเดียวที่เหมาะกับฉัน ฉันเคยs/ {4}/แปลงการเยื้อง 4 ช่องว่างเป็นแท็บ
CrazyPyro

10

คำสั่งtr ที่ดีกว่า:

tr [:blank:] \\t

สิ่งนี้จะล้างผลลัพธ์ของ say, unzip -l , สำหรับการประมวลผลเพิ่มเติมด้วย grep, cut ฯลฯ

เช่น,

unzip -l some-jars-and-textfiles.zip | tr [:blank:] \\t | cut -f 5 | grep jar

ฉันไม่ต้องใช้เครื่องหมายคำพูดเพื่อให้มันใช้งานได้:tr [:blank:] \\t
อร์

3

ดาวน์โหลดและเรียกใช้สคริปต์ต่อไปนี้เพื่อแปลงซอฟต์แท็บซ้ำเป็นฮาร์ดแท็บในไฟล์ข้อความธรรมดา

วางและเรียกใช้สคริปต์จากภายในโฟลเดอร์ซึ่งมีไฟล์ข้อความธรรมดา

#!/bin/bash

find . -type f -and -not -path './.git/*' -exec grep -Iq . {} \; -and -print | while read -r file; do {
    echo "Converting... "$file"";
    data=$(unexpand --first-only -t 4 "$file");
    rm "$file";
    echo "$data" > "$file";
}; done;

2

ตัวอย่างคำสั่งสำหรับการแปลงไฟล์. js แต่ละไฟล์ภายใต้ dir ปัจจุบันเป็นแท็บ (แปลงเฉพาะช่องว่างนำหน้า):

find . -name "*.js" -exec bash -c 'unexpand -t 4 --first-only "$0" > /tmp/totabbuff && mv /tmp/totabbuff "$0"' {} \;

ทดสอบใน cygwin บน windows 7
arkod

1

astyleนอกจากนี้คุณยังสามารถใช้ ฉันพบว่ามันมีประโยชน์มากและมีหลายตัวเลือกด้วย:

Tab and Bracket Options:
   If  no  indentation  option is set, the default option of 4 spaces will be used. Equivalent to -s4 --indent=spaces=4.  If no brackets option is set, the
   brackets will not be changed.

   --indent=spaces, --indent=spaces=#, -s, -s#
          Indent using # spaces per indent. Between 1 to 20.  Not specifying # will result in a default of 4 spaces per indent.

   --indent=tab, --indent=tab=#, -t, -t#
          Indent using tab characters, assuming that each tab is # spaces long.  Between 1 and 20. Not specifying # will result in a default assumption  of
          4 spaces per tab.`

0

tr -s '[:blank:]' '\t'หากจะพูดถึงเกี่ยวกับการเปลี่ยนพื้นที่ติดต่อกันทั้งหมดบนเส้นด้วยแท็บแล้ว

[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda
Device         Start
/dev/sda1       2048
/dev/sda2     411648
/dev/sda3    2508800
/dev/sda4   10639360
/dev/sda5   75307008
/dev/sda6   96278528
/dev/sda7  115809778
[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda | tr -s '[:blank:]' '\t'
Device  Start
/dev/sda1       2048
/dev/sda2       411648
/dev/sda3       2508800
/dev/sda4       10639360
/dev/sda5       75307008
/dev/sda6       96278528
/dev/sda7       115809778

หากจะพูดถึงเกี่ยวกับการเปลี่ยนช่องว่างทั้งหมด (พื้นที่เช่นแท็บบรรทัดใหม่ ฯลฯ ) tr -s '[:space:]'แล้ว

[root@sysresccd /run/archiso/img_dev]# sfdisk -l -q -o Device,Start /dev/sda | tr -s '[:space:]' '\t'
Device  Start   /dev/sda1       2048    /dev/sda2       411648  /dev/sda3       2508800 /dev/sda4       10639360        /dev/sda5       75307008        /dev/sda6     96278528        /dev/sda7       115809778  

หากคุณกำลังพูดถึงการแก้ไขไฟล์ที่เสียหายจากแท็บให้ใช้expandและunexpandตามที่กล่าวไว้ในคำตอบอื่น ๆ



-1

สิ่งนี้จะแทนที่ช่องว่างที่ติดต่อกันด้วยช่องว่างเดียว (แต่ไม่ใช่แท็บ)

tr -s '[:blank:]'

สิ่งนี้จะแทนที่ช่องว่างที่ติดต่อกันด้วยแท็บ

tr -s '[:blank:]' '\t'

จริงๆแล้ว-cมันจะแทนที่อักขระที่ต่อเนื่องกันที่ไม่ใช่ช่องว่าง
wingedsubmariner

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