본문 바로가기

스터디/리눅스 커맨드라인

[리눅스] 20. 텍스트 편집

 

1. 텍스트 처리

1) cat - 파일과 쵸준 출력을 연결

cat 명령어는 텍스트 파일을 만들 수 있다.
# foo.txt 파일 생성
$ cat > foo.txt
	ssak dook. 

# foo.txt 파일 출력
$ cat -A foo.txt
^Issak dook.  $

# 줄 번호롸 공백 줄을 제거해서 출력
$ cat -ns foo.txt
1 ssak
2
3 dook
-A옵션 : 텍스트 내의 비출력 문자를 표시한다. (ex. 탭 또는 스페이스)
^I : 탭 문자와 동일하다.
$ : 스페이스를 의미한다.

n옵션 : 줄 번호를 매긴다.
s 옵션 : 공백 줄을 제거한다.

 

2) sort - 텍스트 파일의 행을 정렬

커맨드라인에 명시된 하나 이상의 파일의 내용물들을 정렬하고 표준 출력으로 결과를 전달한다.
# foo.txt 생성 (정렬하면서)
$ sort > foo.txt
c
b
a

# 출력
$ cat foo.txt
a
b
c​

 

sort 주요 옵션 (사용 방법은 책으로..)

  • -b : 각 줄의 첫 공백들을 무시하고 공백이 아닌 첫 문자를 기준으로 정렬한다.
  • -f : 대소문자를 구분하지 않는다.
  • -n : 문자열의 숫자 값을 평가하여 정렬한다.
  • -r : 역순으로 정렬한다.
  • -o : 정렬된 결과를 표준 출력이 아닌 file로 보낸다.
  • -t : 스페이스나 탭으로 필드를 구분한다.
  • -k : 복수로 정렬 가능.
복수키 정렬

복수키 정렬은 sort 옵션 중 -k 에 해당한다.
--key= field1[,field2]​

필드 전체가 아닌 키 필드로 지정된 field1부터 field2까지를 기준으로 정렬한다.

예를 들면,

$ sort --key=1,1 --key=2n test.txt
F 5
F 6
F 7
S 2
S 6
S 8

--key=1,1 : 첫 번째 필드(F, S)로 시작해서 첫 번째 필드로 끝난다는 의미이다.
--key=2n : 두 번째 필드(5, 6, 7, ...)가 정렬키고 숫자 값으로 정렬한다는 의미이다.

여기서! 
--key=2,3은 두 번째에서 세 번째를 의미하고, 두 번째와 네 번째를 정렬키로 잡고 싶으면 --key=2,2 --key=4,4로 해야한다.

 

2. 텍스트 자르고 붙이기

1) cut - 파일들의 각 행 일부를 삭제

텍스트 일부를 추출하고 그 부분을 표준 출력으로 보낸다.

 

cut 선택 옵션

  • -c char_list : char_list에 정의된 영역을 추출한다.
  • -f field_list : field_list에 정의된 하나 이상의 필드를 추출한다.
  • -d delim_char : -f로 지정했을 때, delim_char를 필드 구분자로 사용한다. 기본적으로 필드들은 하나의 탭 문자로 구분되어야 한다 
  • --complement : -c와 -f로 명시된 여역을 제외한 모든 부분을 추출한다.

2) paste - 파일들의 행을 합친다

cut 명령어와 반대의 명령어이다.
파일에서 텍스트 열을 추출하는 대신에, 파일에 하나 이상의 텍스트 열을 추가한다.

 

3) join - 공통 필드로 두 파일의 행을 합친다.

join은 항상 공유키 필드로 복수의 데이블에서 자료를 가져와 원하는 결과의 형태로 합치는 관계형 데이터베이스와 관련된 작업이다.

 

3. 텍스트 비교

텍스트 비교는 텍스트 파일들의 버전을 비교하는 데 종종 유용하다. 이는 시스템 관리자들과 소프트웨어 개발자들에게 중요한 부분이다.

 

1) comm - 정렬된 두 파일을 행 단위로 비교한다.

comm 프로그램은 두 텍스트 파일을 비교하고 각각 유일한 행과 공통된 행들을 표시한다.
 iseungmin@iseungmin-ui-MacBookAir  ~/test  cat > file1.txt                                                                                                         ✔  2491  17:08:17
a
b
c
d
 iseungmin@iseungmin-ui-MacBookAir  ~/test  cat > file2.txt                                                                                                         ✔  2492  17:08:31
a
b
c
e
 iseungmin@iseungmin-ui-MacBookAir  ~/test  comm file1.txt file2.txt                                                                                                ✔  2493  17:08:42
		a
		b
		c
d
	e​
첫 번째 열은 파일 인자의 유일한 행을 포함하고, 두 번째 구 번째 파일 인자의 유일한 행을 포함한다. 그리고 세 번째 열은 두 파일의 공통된 행을 포함한다.

 

2) diff - 파일을 행 단위로 비교한다.

comm 프로그램과 유사하지만 diff는 좀 더 많이 복잡한 툴이다.
많은 출력 포맷을 지원하고 한꺼번에 많은 텍스트 파일들을 처리할 수 있는 능력을 가지고 있다.

 iseungmin@iseungmin-ui-MacBookAir  ~/test  diff file1.txt file2.txt                                                                                                ✔  2498  17:19:34
4c4
< d
---
> e​

 iseungmin@iseungmin-ui-MacBookAir  ~/test  diff -c file1.txt file2.txt                                                                                           1 ↵  2499  17:20:07
*** file1.txt	2022-05-30 17:08:29.000000000 +0900
--- file2.txt	2022-05-30 17:08:41.000000000 +0900
***************
*** 1,4 ****
  a
  b
  c
! d
--- 1,4 ----
  a
  b
  c
! e​
문맥 방식(-c 옵션)을 사용하면 위의 결과와 같다.

 

3) patch - 원본에 diff 적용하기

patch 프로그램은 텍스트 파일에 수정 내용을 적용하기 위해 사용된다. 일반적으로, diff의 출력 결과를 받아서 이전 버전의 파일을 새 버전으로 변환시키는 데 사용된다.

예를 들면,
리눅스 커널은 작은 수정 사항들을 끊임없이 제출하는 기여자들로 구성된 거대학 느슨한 구조의 팀에 의해 개발된다. 리눅스 커널은 수백만 줄의 코드로 이루어져 있지만 한 기여자에 의해 한 번에 만들어지는 수정 사항은 매우 작다. 
소스 기여자들이 매번 작은 수정 사항을 만들 때마다 전체 커널 소스 트리의 개발자들에 그것을 보낸다는 것은 말도 안되기 때문인데 diff 파일만을 보낸다. 
diff 파일은 커널의 예전 버전과 기여자가 변경한 새 버전 간의 변경 내역을 포함하고 있다. diff의 수신자는 patch 프로그램을 사용하여 자신의 소스 트리에 변경 내역을 적용할 수 있다.

diff/patch 사용은 두 가지 중요한 이점을 제공한다.
1. diff 파일은 전체 소스 트리의 크기에 비해 매우 작다.
2. diff 파일은 변경 내역을 간결학세 보여준다. 따라서 패치 검토자가 평가를 빠르게 할 수 있다.

 iseungmin@iseungmin-ui-MacBookAir  ~/test  diff -Naur file1.txt file2.txt > patchfile.txt                                                                          ✔  2511  17:40:32
 iseungmin@iseungmin-ui-MacBookAir  ~/test  ls                                                                                                                    1 ↵  2512  17:40:59
file1.txt     file2.txt     foo.txt       patchfile.txt
 iseungmin@iseungmin-ui-MacBookAir  ~/test  patch < patchfile.txt                                                                                                   ✔  2513  17:41:00
patching file file1.txt
 iseungmin@iseungmin-ui-MacBookAir  ~/test  cat file1.txt                                                                                                           ✔  2514  17:41:07
a
b
c
e​

-Naur : patch 작업을 할 때 사용된다.

 

4. 신속한 편집

지금까지의 텍스트 편집기는 대체로 대화형이었다. 즉 수동으로 커서를 여기저기 이동하고 변경 내용을 타이핑 하였는데,
이번에는 비대화형 방식의 편집기이다.

 

1) tr - 문자들을 변환 또는 삭제하기

tr 프로그램은 문자들을 변환하는데 사용된다. 

 iseungmin@iseungmin-ui-MacBookAir  ~/test  echo "lowercase" | tr a-z A-Z                                                                                           ✔  2515  17:41:14
LOWERCASE​
위의 코드처럼 a-z 소문자를 모두 A-Z 대문자로 변환하였다.

 

2) sed - 텍스트 필터링과 변환용 스트림 편집기

단일 편집 명령어나 복수의 명령어를 포함한 스크립트 파일이 주어지는데 그러고 나서 그 명령어들은 텍스트 스트림의 각 행 위에서 수행된다.

하나의 예를 보자면,
 iseungmin@iseungmin-ui-MacBookAir  ~/test  echo "front" | sed 's/front/back/'                                                                                  0|1 ↵  2517  17:57:02
back​
echo를 사용하여 한 단어 스트림을 생성하고 그것을 sed로 송신한다. sed는 그 스트림의 텍스트에 s/front/back 명령을 수행하고 결과로 back을 출력한다.

 

3) aspell - 대화식 맞춤법 검사기

aspell 프로그램은 맞춤법 검사가 필요한 다른 프로그램에서 주로 사용된다. 또한 커맨드라인에서 단독 툴로서 효과적으로 사용될 수 있다. HTML 문서, C/C++ 프로그램, 이메일 메시지와 그 외 특수한 텍스트 등 다양한 종류의 텍스트 파일들을 지능적으로 검사하는 능력을 가지고 있다.

aspell check textfile​

 

'스터디 > 리눅스 커맨드라인' 카테고리의 다른 글

[리눅스] 22. 인쇄  (0) 2022.06.05
[리눅스] 21. 출력 포맷 지정  (0) 2022.06.03
[리눅스] 19. 정규 표현식  (0) 2022.05.30
[리눅스] 18. 파일 보관 및 백업  (0) 2022.05.23
[리눅스] 17. 파일 검색  (0) 2022.05.23