현재 나는 다음을 사용합니다:
sed -i -e "5a\\
${text}" $filename
변수 텍스트에 "\epsilon"과 같은 문자열이 포함된 특정 줄에 항목을 추가합니다.
그것을 사용할 때
echo -E $text
문자열은 잘 표시되지만 에 전달된 문자열에서 확장하면 sed
모든 이스케이프 문자가 확장되고 결과는 내가 원하는 것과 다릅니다.
아무것도 이스케이프하지 않고 문자열의 원시 내용을 사용하도록 sed를 어떻게 얻을 수 있습니까?
답변1
sed 명령은 a\
이스케이프 문자를 해석하므로 삽입하려는 문자열에 백슬래시를 반복해야 합니다. 이 시도:
sed -e "5a\\
$(echo -E "$text" | sed -e 's/\\/\\\\/g')"
답변2
인용은 까다롭습니다. awk나 Perl과 같이 추가 따옴표가 필요하지 않은 도구를 사용하는 것이 좋습니다. 이 두 도구를 사용하면 명령줄이나 환경을 통해 인수를 전달하고 이를 텍스트 작업에 사용할 수 있습니다. 펄 사용:
export text
perl -i -pe '$_ .= "$ENV{text}\n" if $. == 5' "$filename"
awk를 사용하면 파일을 수동으로 이동해야 합니다.
tmp=$(TMPDIR=$(dirname -- "$filename") mktemp)
awk -v text="$text" '{print} NR==5 {print text}' <"$filename" >"$tmp" &&
mv -- "$tmp" "$filename"
답변3
일반적으로 escaping을 사용할 수 있습니다 printf "%q"
. 다음을 시도해 보십시오.
text='\epsilon'
echo -e "$text"
silon
그리고 %q
:
text=$(printf "%q" '\epsilon')
echo -e "$text"
\epsilon
답변4
나는 sed 전문가가 아니기 때문에 echo를 사용하여 설명하는 것이 더 쉽다고 생각합니다.
큰따옴표 대신 작은따옴표를 사용하세요.
예시 1:
echo "one\\two"
one\two
예 2:
echo 'one\two'
one\two
따라서 example2 방식을 사용하면 아무 것도 탈출할 필요가 없습니다. 작은따옴표 's\t\r\i\n\g'로 묶인 문자열은 있는 그대로 해석됩니다. (\ 문자는 이스케이프 문자로 사용할 수 없습니다)
원천:하나