Bash는 줄에 특정 문자만 포함되어 있는지 확인합니다.

Bash는 줄에 특정 문자만 포함되어 있는지 확인합니다.

파일의 첫 번째 줄을 확인하고 "X"만 포함되어 있는지 확인하고 싶습니다. 첫 번째 줄에 "X" 이외의 다른 항목이 포함되어 있으면 "YES"를 에코하고, 그렇지 않으면 "No"를 에코하고 싶습니다. 예:

파일의 첫 번째 줄은 XXXXXXXyes로 출력해야 하는 내용 입니다.

또한 마지막 줄에서 어떻게 이 작업을 수행할 수 있습니까?

답변1

다음 스크립트는 파일 이름을 인수로 사용하고 첫 번째 줄과 마지막 줄이 X 문자로만 구성되어 있는지 확인합니다.

#!/bin/bash

echo First line
if [ "$(head -n 1 $1 | grep '^X\+$')" == "" ]; then
    #echo something else than X found in the first line
    echo no
else
    #echo only X found in the first line
    echo yes
fi

echo Last line
if [ "$(tail -n 1 $1 | grep '^X\+$')" == "" ]; then
    #echo something else than X found in the last line
    echo no
else
    #echo only X found in the last line
    echo yes
fi

답변2

이전에 귀하의 질문에 답변한 것처럼 (여기그리고여기): 다른 모든 줄을 삭제하고 yes현재 줄을 문자열로 바꾸거나 no문자열을 제외한 내용이 포함되어 있는지 여부에 따라 바꿉니다.싱글 X.

sed '1!d; s/^X$/no/; t; s/.*/yes/' file

이 패턴은 ^X$한 줄의 단일 문자와 일치하므로, 그 안에 문자가 하나만 있는 경우 X첫 번째 대체는 전체 줄을 문자열로 대체합니다. 가장 최근 명령이 변경된 경우 명령 자체는 스크립트의 나머지 부분을 건너뜁니다.noXts///

마지막 줄을 보려면 코드에서 대신 사용하세요 $.1sed

sed '$!d; s/^X$/no/; t; s/.*/yes/' file

답변3

제목("...한 줄에 특정 문자만 포함된 경우") 때문에 "only X"는 " X문자만"을 의미하는 줄 알았습니다.에스”, 엄밀히 말하면 “한 글자만”이라고 말하는 것이 아닙니다 X.

그리고 sed. 더 일반적이므로 마지막 줄부터 살펴보겠습니다.

sed -n -e '$ ! d' -e '/^X*$/ ino' -e '/^X*$/ ! iyes' -e '$ q'

N행을 확인하려면 $첫 번째와 마지막 표현식을 NEg(N=5)로 바꾸세요.

sed -n -e '5 ! d' -e '/^X*$/ ino' -e '/^X*$/ ! iyes' -e '5 q'

N=1은 단순화될 수 있습니다. 이 경우 첫 번째 표현식이 필요하지 않고 마지막 표현식은 다음과 같을 수 있기 때문입니다 q.

sed -n -e '/^X*$/ ino' -e '/^X*$/ ! iyes' -e q

노트:

  • N 번째 라인이 없으면 출력이 없습니다.

  • q sed최대한 빨리 종료해 주셔서 감사합니다 . (N행 이후의 행은 처리되지 않습니다.)

  • ^XX*$대신 사용할 수 있습니다 ^X*$. 관련 행이 비어 있으면 다른 출력이 생성됩니다. 선이 정확한지 테스트하려면 를 X사용하세요 ^X$.

  • 일반적으로 N은 두 번, ^X*$두 번 나타납니다. 그렇지 않다마른그러나 쉘 변수를 사용할 수 있습니다.

    N='$'
    pattern='^X*$'
    sed -n -e "$N ! d" -e "/$pattern/ ino" -e "/$pattern/ ! iyes" -e "$N q"
    

답변4

NUL 문자를 포함할 수 있는 줄(또는 더 일반적으로 유효한 문자를 형성하지 않는 바이트 시퀀스나 LINE_MAX개행 문자보다 길거나 구분되지 않는 줄을 포함하는 비텍스트)을 고려하려는 경우 전환을 원할 수 있습니다 zsh. 다른 쉘은 쉽게 대처하지 못하며 텍스트 유틸리티는 다음 중 하나를 보장하지 않습니다.

#! /bin/zsh -
if IFS= read -r line < file; then
  case $line in
    ("")     print -u2 empty;
    (*[^X]*) print -u2 does not contain only Xes;;
    (*)      print OK, only Xes;;
  esac
else
  print -u2 a full lines could not be read
fi

또는 다음으로 전환하세요 perl.

perl -e '
  open FILE, "<", "file" or die "Cannot open: $!\n";;
  $_ = <FILE>;
  die "a line could not be read\n" unless defined $_;
  die "a full line could not be read\n" unless /\n$/;
  chomp;
  die "does not contain only Xes\n" if /[^X]/;
  print "OK, only Xes\n"'

관련 정보