변수(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
해당 변수의 내용은 의 내용에서 각 항목 앞에 삽입됩니다.perl
perl
pattern
abc.txt
Bourne과 같은 쉘의 x
변수를 제외한 모든 문자에 문자를 할당 하려면 다음을 사용할 수 있습니다.'
a='x'
따라서 백슬래시의 경우:
a='\'
개행 문자의 경우:
a='
'
줄 바꿈과 같은 제어 문자의 경우에는 더욱 악화되지만 백스페이스나 캐리지 리턴 문자의 경우에는 더욱 악화되어 코드가 덜 명확해질 수 있습니다.
$'...'
ksh93에서는 이러한 문자를 이스케이프 형식으로 지정하기 위해 새로운 형식의 인용을 도입했습니다 . bash
FreeBSD zsh
또는 mksh
FreeBSD 와 같은 다른 쉘은 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