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$単一行の単一文字と一致するため、その中に文字が1つしかない場合、X最初の置換は行全体を文字列に置き換えます。最新のコマンドが変更された場合、コマンド自体はスクリプトの残りの部分をスキップします。noXts///

最後の行を表示するには、コードで代わりに使用してください$1sed

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"'

関連情報