Проверить, совпадает ли первый символ с последним?

Другой вариант — make -v. В моем ноутбуке:

$ make -v 
GNU Make 4.1
Built for x86_64-pc-linux-gnu
Copyright (C) 1988-2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Тогда построенная тройка есть x86_64-pc-linux-gnu.

4
06.12.2020, 08:28
5 ответов

При обработке строк текста наиболее очевидным является 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
18.03.2021, 22:44

Вам нужно

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\}$'

По умолчанию grepиспользует--basic-regexp(базовое -регулярное -выражение, сопоставление шаблонов BRE ), которое метасимволы -, такие как ?, +, {, |, (и )теряют свое особое значение и совпадают буквально, и чтобы использовать их как регулярное выражение, нам нужно использовать экранированные типы \?, \+, \{, \|, \(и \)или просто переключите PATTERN Matching на ERE с помощью-E(Но обратите внимание, что ERE POSIX не имеют обратных -ссылок ).


Чтобы проверить, являются ли строки одинаковыми по длине символами N:

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

Аналогично для 3 длины символов:

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

снова, как сказано выше, это вернет строку (s )как только 3(N вообще )длина символа xxx, если вы не хотите эти, измените на:

grep -- '^\([a-zA-Z]\{3\}\).*\1$'
4
18.03.2021, 22:44

Зачем использовать внешнюю утилиту, такую ​​как grepили awk, если тест может быть легко выполнен оболочкой?

Предполагая, что строка содержит как минимум два символа -, можно утверждать, что последний символ равен первому символу, если строка содержит только один символ, но я думаю, что вопрос ОП касается строки, содержащей два или более символов.

#!/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
0
18.03.2021, 22:44

Этого также можно добиться с помощью команды cut.

#!/bin/bash
# GNU bash, version 4.4.20

str="abbba" 
firstchr=$(echo $str |  cut -c 1)
lastchr=$(echo $str  | rev | cut -c 1)

if [ "$firstchr" == "$lastchr"  ]
then
   echo "Yes, match"
else
   echo "No match"
fi

Выход:

Да, соответствует

Проверено на:https://rextester.com/l/bash_online_compiler

0
18.03.2021, 22:44

Разбить текущую запись на пустую строку, а затем сравнить первое поле с последним

$ echo "racecar" \
| gawk -F "" '$1 == $NF'
racecar
  • Обратите внимание, что этот артефакт работает только с GNU awk, как указано @Ed Morton.
0
18.03.2021, 22:44

Теги

Похожие вопросы