텍스트 \n을 개행 문자로 바꾸는 방법은 무엇입니까? (OS X에서) [중복]

텍스트 \n을 개행 문자로 바꾸는 방법은 무엇입니까? (OS X에서) [중복]

쉘 기록에서 무언가를 추출하여 파일에 저장하는 스크립트가 있지만 기록 항목에 줄 바꿈이 있으면 \n줄 바꿈 대신 텍스트로 반환됩니다. \n파일에 저장하기 전에 개행 문자로 바꾸고 싶습니다 .

sedOS X를 사용하고 있는데 문제가 OS 와 함께 제공되는 BSD 기반 문제일 수 있다고 생각했습니다 .sedgsedsedgsed

history -1 | awk '{$1=""; print}' | gsed -e 's/^[[:space:]]*//' -e s/'\\n'/"\n"/

그러나 가능하다면 Linux나 OS의 기본 유틸리티 와 함께 ​​사용할 수 있는 것을 원합니다 . sed분명히 gsed필요 .sedsedgsed

답변1

sed 's/\\\\/& /g;s/\\n/\
/g;  s/\\\\ /\\\\/g' <in >out

...백슬래시 이스케이프를 잘못 해석하지 않고 ewline 대체를 처리해야 합니다. 이렇게 하면 \n입력에 리터럴을 계속 포함할 수 있습니다. 그러나 나는 역사 명령에서 \\n를 얻는 방법에 대해 약간 모호합니다 .\n

다음과 같이 이스케이프 처리하지 않고 기록 파일에서 ewline을 읽는 zsh방법을 알아내려고 합니다 .\n

echo '
\n'
history -1

11355 echo '\n\n'

그건 작동하지 않습니다. 그래서 나는 이것을 시도했습니다 :

hist(){ ! cat "$1"; }
echo '
\n'
FCEDIT=hist fc -1

echo '
\n'

...이것이 아마도 당신이 해야 할 일일 것입니다

어떤 이유로 인해 ewlines 또는 출력은 모호한 방식으로 zsh이스케이프되지만 일부 편집자에게 기록 명령을 제공하면 실제 내용을 제공합니다.\nhistoryfc -l

zsh주요 history작동 모드는 fc이며 history명령은 의 별칭에 지나지 않습니다 fc -l. fc이 옵션을 사용하여 호출 하면 -l일치하는 기록 행을 표준 출력으로 나열합니다.(인쇄할 수 없는 문자를 모호하게 이스케이프 처리한 후)그러나 fc기본 동작은 해당 인수의 모든 기록 발생을 기록한 하나 이상의 임시 파일 인수를 사용하여 다른 유틸리티를 호출하는 것입니다.

fc환경 변수에서 호출하는 유틸리티의 이름을 파생합니다 $FCEDIT. 설정되지 않았거나 null인 경우 에서 $EDITOR또는 유사하게 실패한 경우 기본값 에서 파생됩니다 vi. 호출된 유틸리티가 true를 반환하면 해당 유틸리티 fc를 실행하려고 시도합니다.(아마도)임시 파일이 삭제되기 전에 편집되었습니다.

따라서 위의 명령 시퀀스는 cat모든 편집기 명령을 대체하고 반환 값을 반전시켜 임시 파일을 성공적으로 읽으면 false를 반환하여 명령을 실행하려는 추가 시도를 fc방지합니다 .fc

외부 유틸리티 호출이 필요하지 않은 보다 완전한 임베디드 솔루션은 다음과 같습니다.

history()
        case    $1      in
        (*/*) ! while   [ -r "$1" ]
                do      while   read -rE RTN
                        do :;   done    <$1
                shift;  done;;
        (*)     local   RTN=1  IFS=
                FCEDIT=history fc "$@"
                return  $((RTN*$?))
        esac

zsh... 명령 이 실행될 것으로 예상되는 모든 인수 목록을 거의 투명하게 처리해야 합니다 history. 단, 출력은 항상 리터럴이고 출력에는 기록 타임스탬프나 이벤트 번호가 포함되지 않습니다.(이렇게 호출하지 않는 한 history -l [args], 이 경우 내장 기능으로 동작합니다 history).

관련 정보