다음과 같은 파일이 있습니다.
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
시스템에 설치된 패키지에 대한 정보를 보려면 info
tr 페이지에 아주 좋은 예와 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 -