Risposte:
Un esempio potrebbe essere stato utile, ma se ti avessi capito correttamente, avrebbe funzionato:
echo "Hello: world" | cut -f1 -d":"
Questo trasformerà "ciao: mondo" in "ciao".
basenamee cut, vedere la risposta di Dennis di seguito
cutpuò leggere da stdin, quindi è meglio soprattutto quando hai una stringa molto lunga che devi elaborare, come il contenuto di un file.
hello: world. Questa è una mezza risposta.
In Bash (e ksh, zsh, trattino, ecc.), È possibile utilizzare l'espansione dei parametri con %cui verranno rimossi i caratteri dalla fine della stringa o #che rimuoveranno i caratteri dall'inizio della stringa. Se si utilizza uno di questi caratteri, verrà rimossa la stringa di corrispondenza più piccola. Se raddoppi il personaggio, il più lungo verrà rimosso.
$ 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:worlddiventerà hello:wousando ${a%:*}?
"${a##*:}"per ottenere solo tomorrow=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'; [[$ a = ~ $ pattern]]; echo "$ {BASH_REMATCH [1]}" `. Ciò corrisponde solo se sono presenti due punti. Se si desidera che sia facoltativo, è necessario utilizzare un modello diverso. Una spiegazione delle regex di Bash (e delle regex in generale) va oltre lo scopo di questi commenti. Puoi trovare altre domande che ne discutono o pubblicare le tue.
egrep -o '^[^:]*:'
egrepè grep con -E. Non fa differenza qui dal normale grep. -oindica a grep di stampare solo la parte della riga corrispondente all'espressione. ^fissa la corrispondenza all'inizio di una riga. [^:]*corrisponde a zero o più caratteri che non sono il :personaggio. :corrisponde al personaggio :.
Supponiamo che tu abbia un percorso con un file in questo formato:
/dirA/dirB/dirC/filename.file
Ora vuoi solo il percorso che include quattro "/". genere
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
e il tuo output sarà
/dirA/dirB/dirC
Il vantaggio di usare cut è che puoi anche tagliare la directory più alta e il file (in questo esempio), quindi se scrivi
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
il tuo output sarebbe
/dirA/dirB
Anche se puoi fare lo stesso dall'altro lato della stringa, in questo caso non avrebbe molto senso digitare
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
risultati in
dirA/dirB/dirC
In alcuni altri casi, anche l'ultimo caso potrebbe essere utile. Ricorda che non c'è un "/" all'inizio dell'ultima uscita.
tagliare tutto dopo l'ultima istanza di ":"
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
e se volessi eliminare l'ultimo ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: vorresti sostituirlo :con /(dove dovrebbe essere il colon sed \/)
cutfunziona, ma la risposta di I Dennis è migliore e più flessibile. Qualcuno sa se genera un nuovo processo comecut?