파일의 첫 번째 줄을 확인하고 "X"만 포함되어 있는지 확인하고 싶습니다. 첫 번째 줄에 "X" 이외의 다른 항목이 포함되어 있으면 "YES"를 에코하고, 그렇지 않으면 "No"를 에코하고 싶습니다. 예:
파일의 첫 번째 줄은 XXXXXXX
yes로 출력해야 하는 내용 입니다.
또한 마지막 줄에서 어떻게 이 작업을 수행할 수 있습니까?
답변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
첫 번째 대체는 전체 줄을 문자열로 대체합니다. 가장 최근 명령이 변경된 경우 명령 자체는 스크립트의 나머지 부분을 건너뜁니다.no
X
t
s///
마지막 줄을 보려면 코드에서 대신 사용하세요 $
.1
sed
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"'