패턴 앞에 백슬래시와 개행 문자를 삽입하는 방법은 무엇입니까?

패턴 앞에 백슬래시와 개행 문자를 삽입하는 방법은 무엇입니까?

나는 변수에서 \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하는 환경 변수를 전달하고 의 내용에서 가 나타날 때마다 해당 변수의 내용을 삽입합니다 .perlperlpatternabc.txt

xBourne과 같은 쉘에서 변수 이외의 문자를 할당하려면 '다음을 사용할 수 있습니다.

a='x'

따라서 백슬래시의 경우:

a='\'

개행의 경우:

a='
'

개행 문자와 같은 제어 문자의 경우 백스페이스나 캐리지 리턴의 경우에는 더욱 악화되지만 이로 인해 코드 읽기가 어려워집니다.

$'...'ksh93에서는 해당 문자를 이스케이프 형식으로 지정하기 위해 새로운 형식의 따옴표를 도입했습니다 . bash, 또는 FreeBSD와 zsh같은 다른 쉘은 이후에 이를 복사하고 확장했습니다( 에서 추가한 형식과 유사 ).mkshsh$'\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

관련 정보