文字列がエスケープシーケンス(\ n)で終わるかどうかを確認する方法

文字列がエスケープシーケンス(\ n)で終わるかどうかを確認する方法

x末尾の改行文字を持つ変数があります。

printf -v x 'hello\n'

最後の文字があるかどうかはxどうすればわかりますか\n

ベストアンサー1

\n文字ではなく文字列の最後の文字を記述するので、その文字が単一文字(newlineASCIIとも呼ばれる)であるかどうかを検出する方法を探していますline feed。文字列が\2文字(バックスラッシュ)で終わるかどうかを検出したくありませんn

かなり最新バージョンのBashでこれを行う1つの方法は次のとおりです。

#!/usr/bin/env bash

printf -v x 'hello\n'

[[ "${x: -1:1}" == $'\n' ]] && echo "Ends in newline"

echo done

${x: -1:1}Bash の部分文字列拡張を使用して文字列の最後の文字を返します。マニュアルページの構文は、負の${parameter:offset:length}オフセットが文字列の先頭ではなく最後から始まることを示しています。また、さまざまな種類のパラメータ拡張との混同を避けるために、最初とスペースの間:にスペースが必要であると述べています。-1

$'\n'Bashの「一重引用符の特別なバリエーション」構文を使用して、「ANSI C標準」で指定された文字を表します。

このオプションは、組み込みコマンドでstdoutの代わりに指定された変数に出力を書き込むためにprintf使用されます。このオプションはすべてのシェルでは機能しない可能性があります(外部バイナリ-vでも機能しない)。文字はprintf直接printfサポートされ、\n「特殊バリアント」構文は必要ありません。

書かれているように、これは変数の終わりの改行でのみ機能しますが、これはあなたが必要とするものです。異なる制御文字および/または文字列の他の場所を特定するには、特定の要件に応じて異なる構文が必要です。

おすすめ記事