
나는 변수에서 \n을 캡처하고(a로 가정) 파일(abc.txt)에서 검색 패턴 앞에 $a를 대체하고 싶었습니다.
누군가 나에게 해결책을 제안해 줄 수 있나요?
> cat abc.txt
hi how are you how is your health
> echo $a
\
예상 출력( 검색 패턴 - how
)
hi \
how are you \
how is your health
답변1
Bourne과 같은 또는 rc와 같은 쉘에서
a='
' perl -pe 's/pattern/$ENV{a}$&/g' < abc.txt
개행 문자를 포함 a
하는 환경 변수를 전달하고 의 내용에서 가 나타날 때마다 해당 변수의 내용을 삽입합니다 .perl
perl
pattern
abc.txt
x
Bourne과 같은 쉘에서 변수 이외의 문자를 할당하려면 '
다음을 사용할 수 있습니다.
a='x'
따라서 백슬래시의 경우:
a='\'
개행의 경우:
a='
'
개행 문자와 같은 제어 문자의 경우 백스페이스나 캐리지 리턴의 경우에는 더욱 악화되지만 이로 인해 코드 읽기가 어려워집니다.
$'...'
ksh93에서는 해당 문자를 이스케이프 형식으로 지정하기 위해 새로운 형식의 따옴표를 도입했습니다 . bash
, 또는 FreeBSD와 zsh
같은 다른 쉘은 이후에 이를 복사하고 확장했습니다( 에서 추가한 형식과 유사 ).mksh
sh
$'\uXXXX'
zsh
해당 쉘에서는 다음을 사용할 수 있습니다.
a=$'\n' a=$'\b' a=$'\r' a=$'\\' a=$'\''
개행, 백스페이스, 캐리지 리턴, 백슬래시 또는 작은따옴표 문자를 지정합니다.
해당 인용 연산자는 아직 표준이 아니므로 이식 가능한 스크립트에서는 사용할 수 없습니다 sh
. 표준 대안은 다음을 사용하는 것입니다.
a=$(printf '\b')
$(cmd)
예를 들어 백스페이스의 경우 명령 대체( )가 의 출력에서 후행 개행 문자를 제거하므로 개행에서는 작동하지 않습니다 cmd
. 다음과 같은 해킹에 의존해야 합니다.
nl=$(printf '\n.'); nl=${nl%.}
(즉, a를 추가 .
하고 나중에 제거하는 것입니다) 보존하기 위해.
는 코드의 perl
해당 표기법도 이해하므로 다음을 수행할 수 있습니다.\n
perl -pe 's/pattern/\n$&/g' < abc.txt
GNU 구현 sed
(그리고 요즘에는 다른 몇몇 구현)도 이를 지원합니다:
sed 's/pattern/\n&/g' < abc.txt
하지만 그것은 표준이 아닙니다. 표준적으로 s
명령 의 대체 부분에 있는 개행 문자는 sed
백슬래시와 실제 개행 문자로 표현되어야 합니다. 즉, 다음과 같습니다.
backslash='\' newline='
'
sed "s/pattern/$backslash$newline&/g" < abc.txt
또는 변수 없이:
sed 's/pattern/\
&/g' < abc.txt
따라서 앞에 백슬래시와 개행 문자를 모두 삽입하려면 pattern
다음이 필요합니다.
sed 's/pattern/\\\
&/g' < abc.txt
백슬래시는 총 3개입니다. 두 개는 문자 백슬래시용이고 하나는 줄 바꿈용입니다. 또는 다음을 사용하여 perl
:
perl -pe 's/pattern/\\\n$&/g' < abc.txt
또는 a
변수를 사용하여:
a='\
' perl -pe 's/pattern/$ENV{a}$&/g' < abc.txt
답변2
다음을 사용하여 자체 bash 명령을 사용할 수도 있습니다.
cat abc.txt | sed -e 's/how/\nhow/g' | while read line; do echo "$line \\"; done