문자열에 개행 문자가 포함된 경우 C 쉘 스크립트 조건

문자열에 개행 문자가 포함된 경우 C 쉘 스크립트 조건

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

일부 구현 및 버전 (예 : cshDebian )에서 작동해야 합니다. 일부 다른 시스템(Solaris 10 등)에서는 운이 더 좋을 수도 있습니다.cshtcsh

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구현/버전에서 작동하지 않을 수도 있습니다)

관련 정보