ファイルの最初の行を確認し、「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$
単一行の単一文字と一致するため、その中に文字が1つしかない場合、X
最初の置換は行全体を文字列に置き換えます。最新のコマンドが変更された場合、コマンド自体はスクリプトの残りの部分をスキップします。no
X
t
s///
最後の行を表示するには、コードで代わりに使用してください$
。1
sed
sed '$!d; s/^X$/no/; t; s/.*/yes/' file
答え3
タイトル(「...1行に特定の文字のみが含まれている場合」)のため、「only X
」は「X
文字のみ」を意味することがわかりました。S”、厳密に言えば“一文字だけ”と言うものではありません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は2回、
^X*$
2回表示されます。そうではない乾いたただし、シェル変数を使用できます。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"'