私の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にはブール値True
とFalse
(列挙)値があります。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
末尾のスペースを削除または処理します。
True
nt
一番上のセクションへの答えは、最後の行がで終わると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' は最後の行を除くすべての行を削除します。