csh
문자열 일치 구문을 사용하여 이를 어떻게 표현하는지 잘 모르겠습니다 . csh 변수에 개행 문자가 포함되어 있는지 테스트하고 싶습니다. 나는 기본적으로 다음을 찾고 있습니다.
if ($mystr !~ <pattern for strings which contain a newline character>)
편집하다:내 특별한 경우에는 다음과 같은 문자열을 만들려고 합니다.
1234ABC
다음과 같은 문자열은 실패합니다.
1234ABC
-------
FOOBAR
이는 명령의 출력입니다 sed
. 즉, sed '1d;$d'
이것이 중요한지 확실하지 않습니다.
내가 줄바꿈을 감지하려고 하는 이유는 " -------"
내가 구문 분석하는 파일 형식의 변경을 방어하기 위한 것이 아닙니다. (어쨌든 나는 개행 문자를 감지하기 위한 일반적인 솔루션을 찾고 있기 때문에 파일로 무엇을 하는지는 중요하지 않다고 생각합니다.)
답변1
if ($mystr:q =~ *'\
'*) echo yes
일부 구현 및 버전 (예 : csh
Debian )에서 작동해야 합니다. 일부 다른 시스템(Solaris 10 등)에서는 운이 더 좋을 수도 있습니다.csh
tcsh
set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes
csh
이제 대부분의 사람들은 신뢰할 수 있는 스크립트를 작성하려는 노력을 포기했습니다. csh
금세기에 왜 그것을 사용합니까?
이 코드는 나에게 효과적입니다 (출력 no
)tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec
set mystr = '1234ABC\
-------\
FOOBAR'
if ($mystr:q !~ *'\
'*) then
echo yes
else
echo no
endif
이렇게 하면 다음 사항에 유의하세요.
set var = `some command`
csh
출력의 각 단어(공백으로 구분)를 배열 some command
의 여러 요소 에 저장합니다 var
.
그리고:
set var = "`some command`"
비어 있지 않은 각 행을 배열 요소에 저장합니다.
명령의 전체 출력을 의 변수에 저장할 수 없는 것 같으 (t)csh
므로 유일한 옵션은 다음과 같습니다.
set var = "`some command`" # note that it removes the empty lines
if ($#var == 1)...
1 엄밀히 말하면 이것은 사실이 아닙니다.
set x = "`some command | paste -d. /dev/null -`"
set var = ""
set nl = '\
'
foreach i ($x:q)
set i = $i:s/.//:q
set var = $var:q$i:q$nl:q
end
(물론 모든 csh
구현/버전에서 작동하지 않을 수도 있습니다)