Réponses:
Un exemple aurait pu être utile, mais si je vous ai bien compris, cela fonctionnerait:
echo "Hello: world" | cut -f1 -d":"
Cela convertira "bonjour: monde" en "bonjour".
basename
et cut
, voir la réponse de Dennis ci
cut
peut lire à partir de stdin, c'est donc mieux, surtout lorsque vous avez une très longue chaîne à traiter, comme le contenu d'un fichier.
hello: world
. C'est une demi-réponse.
Dans Bash (et ksh, zsh, tiret, etc.), vous pouvez utiliser l'expansion des paramètres avec %
laquelle supprimera les caractères de la fin de la chaîne ou #
qui supprimera les caractères du début de la chaîne. Si vous utilisez un seul de ces caractères, la plus petite chaîne correspondante sera supprimée. Si vous doublez le caractère, le plus long sera supprimé.
$ 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
le deviendra hello:wo
en utilisant ${a%:*}
?
"${a##*:}"
pour obtenir seulement tomorrow
=)
a='hello:world:of:tomorrow'; pattern=''^([^:]*:).*$'
; [[$ a = ~ $ motif]]; echo "$ {BASH_REMATCH [1]}" `. Cela ne correspond que s'il y a un signe deux-points. Si vous voulez que ce soit facultatif, un modèle différent devrait être utilisé. Une explication des expressions rationnelles Bash (et des expressions rationnelles en général) dépasse le cadre de ces commentaires. Vous pouvez trouver d'autres questions qui en discutent ou publier les vôtres.
egrep -o '^[^:]*:'
egrep
est grep avec -E
. Cela ne fait aucune différence ici du régulier grep
. -o
demande à grep de n'imprimer que la partie de la ligne qui correspond à l'expression. ^
ancre la correspondance au début d'une ligne. [^:]*
correspond à zéro ou plusieurs caractères qui ne sont pas le :
caractère. :
correspond au caractère :
.
Disons que vous avez un chemin avec un fichier dans ce format:
/dirA/dirB/dirC/filename.file
Maintenant, vous ne voulez que le chemin qui comprend quatre "/". Type
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-4 -d"/"
et votre sortie sera
/dirA/dirB/dirC
L'avantage d'utiliser cut est que vous pouvez également découper le répertoire le plus haut ainsi que le fichier (dans cet exemple), donc si vous tapez
$ echo "/dirA/dirB/dirC/filename.file" | cut -f1-3 -d"/"
votre sortie serait
/dirA/dirB
Bien que vous puissiez faire la même chose de l'autre côté de la chaîne, cela n'aurait pas beaucoup de sens dans ce cas que de taper
$ echo "/dirA/dirB/dirC/filename.file" | cut -f2-4 -d"/"
résulte en
dirA/dirB/dirC
Dans certains autres cas, le dernier cas peut également être utile. Notez qu'il n'y a pas de "/" au début de la dernière sortie.
couper tout après la dernière instance de ":"
cat fileListingPathsAndFiles.txt | grep -o '^.*:'
et si vous vouliez supprimer ce dernier ":"
cat file.txt | grep -o '^.*:' | sed 's/:$//'
@ kp123: vous voudriez remplacer :
par /
(où les deux-points sed devraient être \/
)
cut
fonctionne, mais la réponse de Dennis est meilleure et plus flexible. Est-ce que quelqu'un sait si cela engendre un nouveau processus commecut
?