最初の文字が最後の文字と同じであることを確認しますか?

最初の文字が最後の文字と同じであることを確認しますか?

これについてのアイデアがあります。逆参照を使用する必要がありますgrepが、これが私が得ることができる最も近いものです。

grep "^[a-zA-z]\$[a-zA-z]\

私の問題は、最初の文字==を最後の文字として確認する方法がわからないことです。

答え1

あなたはする必要があります

grep -E '^([a-zA-Z]).*\1$'

最初の文字をキャプチャし(...)、逆参照を最後の文字として使用し、その間の他のすべての文字はスキップされます.*。この-Eスイッチは拡張正規表現一致するため、コマンドの範囲内でキャプチャグループをエスケープする必要はありませんgrep。ただし、次のようにして移植性を向上させることもできます。

grep '^\([a-zA-Z]\).*\1$'

単一の文字を含む行のみを出力したい場合(ただし、同じ最初の文字と最後の文字とも呼ばれます)、オプションでその文字の存在を定義できます。

grep -- '^\([a-zA-Z]\)\(.*\1\)\{0,1\}$'

\{0,1\}一致しないか、一度だけ一致模様 .*\1以上。

またはこれをそれぞれ一致させてください。一つ上記のバイト文字は次のとおりです。

grep -- '^\(.\)\(.*\1\)\{0,1\}$'

(Basic-Regular-Expression、BRE)パターンマッチングはデフォルトでgrep使用されます。ここで、、、、--basic-regexpなどのメタ文字は特別な意味を失い、文字通り一致します。変換定義タイプを使用する必要があります。 、およびまたは単に切り替えてください。?+{|()\?\+\{\|\(\)パターンマッチングEREに接続します-E(ただし、POSIX EREには逆参照はありません)。


文字列の長さが同じであることを確認する窒素:

grep -- '^\([a-zA-Z]\{N-HERE\}\)\(.*\1\)\{0,1\}$'

サム文字の長さ:

grep -- '^\([a-zA-Z]\{3\}\)\(.*\1\)\{0,1\}$'

前述のように、次の行が返されます。サム窒素一般的に)文字の長さxxx、必要でない場合は次のように変更してください。

grep -- '^\([a-zA-Z]\{3\}\).*\1$'

答え2

awkこれは、テキスト行を扱う場合に最も明白です。

awk 'length>1 && substr($0,1,1)==substr($0,length,1)' file

これがシェル変数の場合:

case $var in ''|?) echo no;; "${var#"${var%?}"}"*) echo yes;; *) echo no;; esac
[ "${#var}" -gt 1 ] && [ "${var%"${var#?}"}" = "${var#"${var%?}"}" ]

答え3

シェルはテストを簡単に実行できますが、なぜgrep外部ユーティリティを使用するのですか?awk

文字列に複数の文字が含まれているとします。文字列に1つの文字しか含まれていない場合は、最後の文字が最初の文字と同じであると主張できますが、OPの質問は2つ以上の文字を含む文字列に関するものだと思います。

#!/bin/bash

# set -x
# set -v

is_match() {
   (( ${#1} < 2 )) && return 1
   [[ "${1:0:1}" != "${1: -1}" ]] && return 1
   return 0
}

check() {
   if is_match "$1"
   then
      echo "\"$1\" is a match"
   else
      echo "\"$1\" is not a match"
   fi
}

check ""
check "a?"
check "a*"
check "a"
check "cdc"
check "abbba"
check "é"
check "étéa"
check "été"

出力:

"" is not a match
"a?" is not a match
"a*" is not a match
"a" is not a match
"cdc" is a match
"abbba" is a match
"é" is not a match
"étéa" is not a match
"été" is a match

答え4

現在のレコードを空の文字列に分割し、最初のフィールドを最後のフィールドと比較します。

$ echo "racecar" \
| gawk -F "" '$1 == $NF'
racecar
  • GNU awkこのアーティファクトは@ Ed Mortonが指摘したとおりに機能します。

関連情報