Найти строку, зная ее часть, и вернуть строку

Это зависит от вашей терминальной программы, но большинство терминальных программ не имеют функции сохранения выделенного текста.

LXTerminal, uxterm, Konsole и GNOME Terminal, кажется, лишены этой "функции", но могут быть и другие, у которых она есть. Посмотрите на структуру меню вашей терминальной программы, возможно, там есть что-то вроде "Сохранить выделенное"

8
06.01.2019, 15:55
5 ответов

Si su grepadmite expresiones regulares compatibles con Perl, puede buscar coincidencias no -con avidez hasta el siguiente límite de palabra:

echo "$string" | grep -oP 'Icecream.*?\b'

De lo contrario, haga coincidir la secuencia más larga de caracteres no -en blanco:

echo "$string" | grep -o 'Icecream[^[:blank:]]*'

O mantenga todo en el caparazón y elimine la secuencia final más larga de caracteres que comiencen con un espacio:

echo "${string%% *}"
17
27.01.2020, 20:08

Por ejemplo, si usaGNU grep:

$ echo "Icecream123 AirplaneBCD CompanyTL1 ComputerYU1" | grep -oP '\bIcecream.*?(\s|$)' --color

Utiliza PCRE.

2
27.01.2020, 20:08

Usando un grepque conoce-o:

$ printf '%s\n' "$string" | grep -o '\<Icecream[^[:blank:]]*'
Icecream123

El patrón \<Icecream[^[:blank:]]*coincide con la cadenaIcecream(donde Iestá precedido por un carácter que no es una palabra -, o el comienzo de la línea )seguido de cero o más espacios en blanco que no -(no espacios ni tabulaciones ).


Usandoawk:

$ printf '%s\n' "$string" | awk -v RS=' ' '/^Icecream/'       
Icecream123

El programa awkdivide la cadena en registros -separados por espacios y prueba cada uno. Imprimirá los que comienzan con la cadena Icecream.

Usando mawko GNU awk, también puede usar

printf '%s\n' "$string" | awk -v RS='[[:blank:]]' '/^Icecream/'

ya que interpretan RScomo una expresión regular si contiene más de un carácter.


Con sed, de forma similar agrep:

$ printf '%s\n' "$string" | sed 's/.*\(\<Icecream[^[:blank:]]*\).*/\1/'
Icecream123

Usando/bin/sh:

set -- Icecream123 AirplaneBCD CompanyTL1 ComputerYU1
for string; do
    case $string in
        Icecream*)
            printf '%s\n' "$string"
            break
    esac
done

Perl (con un poco de ayuda detr):

$ printf '%s\n' "$string" | tr ' ' '\n' | perl -ne '/Icecream\S*/ && print'
Icecream123

o simplemente

$ printf '%s\n' "$string" | perl -ne '/(Icecream\S*)/ && print $1, "\n"'
Icecream123
7
27.01.2020, 20:08

Desde que etiquetaste bash:

[[ $string =~ (Icecream[^ ]*) ]] && result=${BASH_REMATCH[1]}

Más generalmente, para un término de búsqueda en$search:

[[ $string =~ ($search[^ ]*) ]] && result=${BASH_REMATCH[1]}

... o con ampliación de parámetros:

# remove any leading text up to -and through- the search text:
x=${string##*$search}

# remove any trailing space onwards
result=$search${x%% *}
8
27.01.2020, 20:08

Tal vez un poco más simple, especialmente porque dice que su versión de grep no es compatible con perl regex:

$ echo $string | tr ' ' '\n' | grep 'Icecream' Icecream123

El trdivide la cadena en líneas reemplazando todos los espacios con líneas nuevas. Entonces puedes usar grepfácilmente.

También puedes escribir lo siguiente para obtener solo lo que sigue a la palabra que buscas:

$ echo $string | tr ' ' '\n' | sed -n 's/Icecream//p' 123

1
27.01.2020, 20:08

Теги

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