Другой вариант — 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
.
При обработке строк текста наиболее очевидным является 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%?}"}" ]
Вам нужно
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$'
Зачем использовать внешнюю утилиту, такую как 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
Этого также можно добиться с помощью команды 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
Разбить текущую запись на пустую строку, а затем сравнить первое поле с последним
$ echo "racecar" \
| gawk -F "" '$1 == $NF'
racecar
GNU awk
, как указано @Ed Morton.