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
기록을 위해 확장 / 확장 해제는 표준 유틸리티 입니다.
kojiro

4
너무 멋져서 표준입니다. 저는 UNIX 철학을 좋아합니다 . 그래도 제자리에서 할 수 있다면 좋을 것입니다.
Matthew Flaschen 2013

3
나는 unexpand가 여기서 작동하지 않는다고 생각한다 .. 그것은 단지 선행 공백만을 변환하고 둘 이상의 공백으로 만 변환한다 .. 여기를 참조하십시오 : lists.gnu.org/archive/html/bug-textutils/2001-01/msg00025.html
olala

13
주의 사항-unexpand는 단일 공백을 탭으로 변환하지 않습니다. 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

또는 Sam Bisbee가 제안한 tr 솔루션의 단순화 된 버전

tr ' ' \\t < someFile > someFile

4
sed 예제에서 모범 사례는 효율성 / 속도상의 이유로 tr을 사용하여 sed 대신 단일 문자를 대체하도록 지시합니다. 또한 tr 예제는 다음과 같이 훨씬 더 쉽습니다.tr ' ' \\t < someFile > someFile
Sam Bisbee

2
물론 tr은 sed보다 성능이 더 좋지만 내가 유닉스를 사랑하는 주된 이유는 무언가를 할 수있는 방법이 많기 때문입니다. 이 대체를 여러 번 계획하면 성능이 좋은 솔루션을 검색하지만 한 번만 수행하려는 경우 편안하게 느끼게하는 명령이 포함 된 솔루션을 검색하게됩니다.
Jonathan

2
arg. 나는 sed가 작동하도록 시행 착오를 사용해야했습니다. 나는 왜 이렇게 더하기 기호를 피해야했는지 모르겠다 :ls -l | sed "s/ \+/ /g"
Jess

awk -v OFS="\t" '$1=$1' file1나는 당신이 (예를 들어, 숫자 0과 라인 시작이있는 경우 것으로 나타났습니다 0 1 2), 다음 행이 결과에서 ommitted됩니다.
Nikola Novak

@Jess "올바른 기본 구문"정규식을 찾았습니다. 기본적으로 sed는 단일 (이스케이프되지 않은) 더하기 기호를 단순 문자로 처리합니다. '?'와 같은 다른 문자도 마찬가지입니다. ... 자세한 정보는 여기에서 찾을 수 있습니다 : gnu.org/software/sed/manual/html_node/… . 유사한 구문 세부 정보는 여기에서 찾을 수 있습니다 (이는 sed가 아니라 grep의 경우) : gnu.org/software/grep/manual/grep.html#Basic-vs-Extended .
Victor Yarema

12

Perl 사용 :

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

3
연속 공백을 단일 탭으로 교체하는 것과 유사한 문제가있었습니다. Perl은 정규 표현식에 '+'를 추가하는 것만으로 작업했습니다.
Todd

물론 그 반대로하고 싶었습니다. 탭을 두 개의 공백으로 변환합니다.perl -p -i -e 's/\t/ /g' *.java
TimP

재귀 적으로 할 수 있습니까?
Aaron Franke

이것은 나를 위해 일한 유일한 변형이었습니다. 저는 s/ {4}/4 칸 들여 쓰기를 탭으로 변환했습니다.
CrazyPyro

10

더 나은 tr 명령 :

tr [:blank:] \\t

이렇게하면 unzip -l 의 출력이 정리됩니다. grep, cut 등으로 추가 처리를 위해 .

예 :

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

작동하도록 따옴표를 사용할 필요가 없습니다.tr [:blank:] \\t
Ömer An

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 파일을 탭으로 변환하는 예제 명령 (선행 공백 만 변환 됨) :

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

Windows 7의 cygwin에서 테스트되었습니다.
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  

탭이 손상된 파일을 수정하는 것에 대해 이야기하는 경우 expandunexpand다른 답변에서 언급 한대로 사용하십시오 .


0

sed 사용 :

T=$(printf "\t")
sed "s/[[:blank:]]\+/$T/g"

또는

sed "s/[[:space:]]\+/$T/g"

-1

연속 된 공백을 하나의 공백으로 대체합니다 (탭은 아님).

tr -s '[:blank:]'

연속 된 공백을 탭으로 대체합니다.

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

실제로 공백 -c아닌 연속 문자를 대체 합니다.
wingedsubmariner

1
질문은 탭에 관한 것입니다. 이것은 답이 아닙니다.
Matthew 읽기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.