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

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

변수(a라고 가정)에서 \n을 캡처하고 파일(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

Bourne과 같은 쉘의 x변수를 제외한 모든 문자에 문자를 할당 하려면 다음을 사용할 수 있습니다.'

a='x'

따라서 백슬래시의 경우:

a='\'

개행 문자의 경우:

a='
'

줄 바꿈과 같은 제어 문자의 경우에는 더욱 악화되지만 백스페이스나 캐리지 리턴 문자의 경우에는 더욱 악화되어 코드가 덜 명확해질 수 있습니다.

$'...'ksh93에서는 이러한 문자를 이스케이프 형식으로 지정하기 위해 새로운 형식의 인용을 도입했습니다 . bashFreeBSD zsh또는 mkshFreeBSD 와 같은 다른 쉘은 sh이를 복사하고 확장했습니다( $'\uXXXX'에서 추가한 대로 zsh).

이 쉘에서는 다음을 사용할 수 있습니다.

a=$'\n' a=$'\b' a=$'\r' a=$'\\' a=$'\''

줄 바꿈, 백스페이스, 캐리지 리턴, 백슬래시 또는 작은따옴표 문자를 지정합니다.

이 참조 연산자는 아직 표준이 아니므로 이식 가능한 sh스크립트에서 사용할 수 없습니다. 표준 대안은 다음을 사용하는 것입니다.

a=$(printf '\b')

$(cmd)예를 들어 백스페이스의 경우 명령 대체( )가 출력에서 ​​후행 줄 바꿈을 제거하기 때문에 개행에는 작동하지 않습니다 cmd. 사람들은 다음과 같은 해커에 의존해야 합니다.

nl=$(printf '\n.'); nl=${nl%.}

(즉, 하나를 추가한 .다음 제거) 유지합니다.

또한 코드에서 이러한 기호를 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

관련 정보