쉘 기록에서 무언가를 추출하여 파일에 저장하는 스크립트가 있지만 기록 항목에 줄 바꿈이 있으면 \n
줄 바꿈 대신 텍스트로 반환됩니다. \n
파일에 저장하기 전에 개행 문자로 바꾸고 싶습니다 .
sed
OS X를 사용하고 있는데 문제가 OS 와 함께 제공되는 BSD 기반 문제일 수 있다고 생각했습니다 .sed
gsed
sed
gsed
history -1 | awk '{$1=""; print}' | gsed -e 's/^[[:space:]]*//' -e s/'\\n'/"\n"/
그러나 가능하다면 Linux나 OS의 기본 유틸리티 와 함께 사용할 수 있는 것을 원합니다 . sed
분명히 gsed
필요 .sed
sed
gsed
답변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
이스케이프되지만 일부 편집자에게 기록 명령을 제공하면 실제 내용을 제공합니다.\n
history
fc -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
).