Respostas:
Um exemplo pode ter sido útil, mas se eu entendi corretamente, isso funcionaria:
echo "Hello: world" | cut -f1 -d":"
Isso converterá "olá: mundo" em "olá".
basename
e cut
, ver a resposta de Dennis abaixo
cut
pode ler do stdin, por isso é melhor, especialmente quando você tem uma sequência muito longa que precisa processar, como o conteúdo de um arquivo.
hello: world
. Isso é meia resposta.
No Bash (e ksh, zsh, dash, etc.), você pode usar a expansão de parâmetros com a %
qual removerá os caracteres do final da string ou os #
caracteres do início da string. Se você usar um único desses caracteres, a menor string correspondente será removida. Se você dobrar o personagem, o mais longo será removido.
$ a='hello:world'
$ b=${a%:*}
$ echo "$b"
hello
$ a='hello:world:of:tomorrow'
$ echo "${a%:*}"
hello:world:of
$ echo "${a%%:*}"
hello
$ echo "${a#*:}"
world:of:tomorrow
$ echo "${a##*:}"
tomorrow
hello:world
se tornar hello:wo
usando ${a%:*}
?
"${a##*:}"
para recebendo apenas tomorrow
=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'
; [[$ a = ~ $ padrão]]; eco "$ {BASH_REMATCH [1]}" `. Isso corresponde apenas se houver dois pontos. Se você deseja que isso seja opcional, um padrão diferente teria que ser usado. Uma explicação das expressões regulares do Bash (e das expressões regulares em geral) está além do escopo desses comentários. Você pode encontrar outras perguntas que discutam isso ou publique as suas.
egrep -o '^[^:]*:'
egrep
é grep com -E
. Aqui não faz diferença do normal grep
. -o
instrui o grep a imprimir apenas a parte da linha que corresponde à expressão. ^
ancora a partida no início de uma linha. [^:]*
corresponde a zero ou mais caracteres que não são o :
caractere. :
corresponde ao personagem :
.
Digamos que você tenha um caminho com um arquivo neste formato:
/dirA/dirB/dirC/filename.file
Agora você deseja apenas o caminho que inclui quatro "/". Tipo
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
e sua saída será
/dirA/dirB/dirC
A vantagem de usar o cut é que você também pode cortar o diretório mais atual e o arquivo (neste exemplo); portanto, se você digitar
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
sua saída seria
/dirA/dirB
Embora você possa fazer o mesmo do outro lado da string, não faria muito sentido nesse caso, como digitar
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
resulta em
dirA/dirB/dirC
Em alguns outros casos, o último caso também pode ser útil. Lembre-se de que não há "/" no início da última saída.
aparar tudo após a última instância de ":"
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
e se você quiser largar esse último ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: você gostaria de substituir :
por /
(onde o cólon sed deve estar \/
)
cut
funciona, mas a resposta de Dennis é melhor e mais flexível. Alguém sabe se gera um novo processo comocut
?