bashスクリプトでsedまたはgrepを使用して、ファイルが特定の文字列で終わっていることを確認してください。

bashスクリプトでsedまたはgrepを使用して、ファイルが特定の文字列で終わっていることを確認してください。

私のUbuntuサーバーにoutput.txtというファイルがあります。 sedまたはgrepを使用して、ファイルの最後の2文字が「nt」であることをどのように確認できますか?ファイルのテキストは次のとおりです。 ifステートメントを返したいです。このような状況では本当です。

上院は9月までに連邦政府の一部に資金を支援するための6つの法案パッケージを通過させ、部分的な政府閉鎖を近く避けました。

上院は法案を75代22に通過させ、深夜締め切りを控え、バイデン大統領の机に法案を送った。

バイデン氏は土曜日に法案に署名すると予想されます。

共和党は、移民関連措置やその他の措置に対する修正案の表決を要求し、法案通過を遅らせ、資金が使い果たされた後、土曜日まで最終表決を延期すると脅した。

チャック・シューマー民主党上院院内代表は、表決に先立ち「韓国に良いニュースがある」と話した。

「私たちは帽子、退役軍人、環境、住宅などのための重要なプログラムに引き続き資金を提供し続けます。今日のパートナーシップの結果、私たちは政府に全額資金を提供するという目標に向かって大きな進歩を遂げました。

答え1

sed私は本当にor hereを使用しませんgrep。できますが、私の考えはtail簡単です。ファイルの最後の3バイトを取得するために使用されますtail(末尾の文字を説明するには3バイトが必要です)(各文字が1バイトを超える可能性があるより複雑なUnicode文字列を見つける場合は\n機能しませんnt)。一致するものがあることを確認してくださいnt

if [ "$(tail -c3 file)" = "nt" ]; then 
  echo yes
else
  echo no
fi

grepたとえば、ファイル全体(NUL文字が含まれていないと仮定)を単一の「行」として扱い、最後の文字を確認してGNUを使用してこれを実行できます。

if grep -qPz 'nt\n$' file; then
 echo yes
else
 echo no
fi

または、sedよりよく、簡単に次のようなものを使用してください(または@steeldriverGNU固有の方法):

if [ "$(sed -n '${/nt$/p;}' file | wc -c)" -gt 0 ]; then 
  echo yes; 
else 
  echo no
fi

でもperl:

if perl -ne '$l=$_; }{ exit($l=~/nt$/ ? 0 : 1)' file; then 
 echo yes
else
 echo no
fi

答え2

UbuntuにはGNU sedがあるのでキューuit コマンドには状態コードを返す拡張機能があるため、最後の行のアドレスを指定し、たとえばnt状態 0 または非 0 で終わる場合は、状態 0 で終了できます。

 if sed -n '${/nt$/q0;q1}' output.txt; then ...

sedの他の可能な状態と区別するために、ゼロ以外の状態を4より大きい値に設定できます。終了ステータス

答え3

使用幸せ(以前のPerl_6)

RakuはPerlファミリーのプログラミング言語です。 Rakuにはブール値TrueFalse(列挙)値があります。Bool日常的または同等の強制を通じて so「そうですか?」) ルーチンは必須True/False出力を生成します。


末尾のスペースを無視します。

ファイルハンドル(例$fh.eof:)の使用:

~$ raku -e 'my $fh = $*ARGFILES.IO.open;  \
            .match(/ nt \h* $/).Bool.say if $fh.eof for $fh.lines;'  file

使用lines.tail:

~$ raku -e '.match(/ nt \h* $/).Bool.say for lines.tail;'  file

#OR:

~$ raku -e 'lines.tail.match(/ nt  \h* $/).Bool.put;'  file

より簡単ですlines.tail

~$ raku -e 'm/ nt \h* $/.so.put for lines.tail;'  file

末尾のスペースを削除または処理します。

Truent一番上のセクションへの答えは、最後の行がで終わるとOKを返し、Falseそうでない場合はOKです。ただし、Falseファイルに 1 つ以上の末尾の改行のみが含まれている場合、上部セクションの応答が返されます。より正確なブール応答を提供するために、末尾のスペースを次のように処理できます。

(シングル) ターミナル改行文字とそれに続く末尾のスペースを削除します。

~$ raku -e '.match(/ nt $/).Bool.say for lines.tail(2).chomp.trim-trailing;'  file

すべての末尾の空白行を削除します(pass slurp)。

~$ raku -e '.match(/ nt $/).Bool.say for slurp.trim-trailing;'  file

末尾の空行をスキップ(linesおよび経由chars):

~$ raku -e 'my $fh = $*ARGFILES.IO.open;  \
             my $a = $_ if .chars for $fh.lines();  \
             $a.match(/ nt $/).Bool.say;'  file

#OR

~$ raku -e 'my $a = $_ if .chars for lines(); put $a ~~ m/ nt $/.so;'  file

https://docs.raku.org/type/Bool
https://docs.raku.org
https://raku.org

答え4

以下は、grepとsedを使用してこれを行う方法の非常に簡単な例です。

#!/usr/bin/bash

result=$(grep -o 'nt$' 'Output.txt' | sed '$!d')
if [ "$result" = 'nt' ]; then
   echo 'Matched !'
else
   echo 'Not found !'
fi

説明する:

  • -o一致する部分のみを印刷します。
  • $は行のすべての終わりと一致します。
  • '$!d' は最後の行を除くすべての行を削除します。

関連情報