tr을 정규식과 함께 사용할 수 있나요?

tr을 정규식과 함께 사용할 수 있나요?

다음과 같은 파일이 있습니다.

AAAA  
BBBB  
CCCC   
DDDD   
etc  

단어는 별도의 줄에 있습니다. 따옴표를 사용하여 추가하고 싶습니다 tr.
그래서 다음을 시도했습니다.

1) 각 단어의 시작 부분에 따옴표를 추가합니다.'AAAA

  • tr '^\w$' '\'\w$' <file.txt 작동하지 않습니다
  • tr '^\w$' ''\w$' <file.txt 작동하지 않습니다

위의 두 상황 모두 명령줄이 중단되는 원인이 됩니다.

2) 끝에 따옴표를 추가하기 위해 다음을 시도했습니다.

tr '\n' ''\n' <file.txt 그러나 이것은 작동하지 않으며 명령줄이 중단됩니다.

왜 이러한 정규 표현식이 에서 작동하지 않습니까 tr?

답변1

이 중 여러 개를 교체할 수는 없습니다 tr. 나는 sed대신 이것을 할 것이다.

$ sed "s/^/'/" file.txt
'AAAA
'BBBB
'CCCC
'DDDD

각 줄의 시작 부분( ^)을 찾아 작은따옴표( )로 바꾸는 것을 의미합니다 '.

"word"를 작은따옴표로 묶으려면 다음 형식의 명령을 사용할 수 있습니다.

$ sed "s/\(.*\)/'\1'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'

이번에는 해당 줄의 모든 내용을 임시 변수( \1)에 저장합니다. 그런 다음 해당 줄을 this 로 바꿉니다 '\1'.

이 명령은 다음과 같이 축약될 수 있습니다. GNU 특정 스위치 사용:

$ sed -r "s/^(.*)$/'&'/" file.txt
'AAAA'
'BBBB'
'CCCC'
'DDDD'

답변2

tr음역용입니다. 널리 사용되는 사용법 중 하나 tr는 문자열의 대소문자를 변경하는 것입니다.

$ echo 'this is a test' | tr a-z A-Z
THIS IS A TEST

일부 운영 체제 버전에는 다음 형식이 tr필요하며 이 경우에도 인용해야 합니다.a-z[a-z]

$ echo 'this is a test' | tr '[a-z]' '[A-Z]'
THIS IS A TEST 

시스템에 설치된 패키지에 대한 정보를 보려면 infotr 페이지에 아주 좋은 예와 tr명령에 대한 추가 설명이 있습니다.

info coreutils 'tr invocation'

달성하려는 목표에는 sed, Perl 또는 awk를 사용할 수 있습니다.

진주:

perl -pe "s/^/'/" file

각 줄에 대해 줄의 시작 부분( ^)과 일치하고 다음으로 대체됩니다.'

Seder:

sed "s/^/'/" file

Perl과 유사한 예

이상한:

awk -v x="'" '{ print x$0 }' foo

변수 x를 다음과 같이 지정 '하고 각 줄에 대해 인쇄한 '다음 전체 줄을 인쇄합니다.

답변3

아니요, tr문자를 하나씩 바꾸는 경우에만 해당됩니다. 이 방법으로는 문자를 추가할 수 없습니다.

Perl과 같은 것을 사용하여 이 작업을 수행할 수 있습니다.

perl -pe "s/\w+/'$&'/"

예를 들어, tr하나의 참조를 다른 참조로만 바꿀 수 있습니다.

tr \" \'

이러한 백슬래시는 문자 자체를 해석하기보다는 문자를 있는 그대로 보내도록 쉘에 지시합니다.

다음은 작동하지 않습니다:

tr '"' '''
tr '"' '\''

첫 번째 매개변수( '"')는 괜찮습니다. 정확히 동일합니다 \". 두 경우 모두 두 번째 인수는 작동하지 않습니다. 두 번째 따옴표는 따옴표를 끝내고 세 번째 인수는 누락된 새 따옴표를 열기 때문에 작은 따옴표와 함께 작은 따옴표를 사용할 수 없습니다. (따라서 쉘은 누락된 닫는 따옴표를 기다리기 위해 새 줄을 엽니다.)

그러나 이 모든 것은 단지 빈 껍데기일 뿐이며 우리와는 아무런 관련이 없습니다 tr.

답변4

가장 빠른 솔루션은 일반적으로 가장 간단한 단일 작업 유틸리티를 사용하는 것입니다.

tr는 간단한 유틸리티이지만 음역(주어진 문자를 다른 문자로 변환), 지정된 문자 삭제 또는 문자 압축 등 다른 목적으로도 사용할 수 있습니다.

sed, awk또는 perl(크기순) 과 같은 보다 일반적인 유틸리티가 이 작업을 수행할 수 있지만 여기에는 이 작업도 훌륭하게 수행하는 단일 작업 유틸리티가 있습니다 paste.

paste -d\' /dev/null file.txt /dev/null

또는:

:|paste -d\' - file.txt -

관련 정보