Причина состоит в том, потому что существует два типа вывода.
STDOUT
)STDERR
)cvs --help
печатает информацию о справке к STDERR
. Канал (|
) ожидает данные, которые были записаны в STDOUT
так, чтобы это могло быть считано STDIN
.
Для получения текста справки от STDERR
кому: STDOUT
(так, чтобы это было читаемо каналом), необходимо перенаправить его.
cvs --help 2>&1 | less
Дальнейшее объяснение здесь.
Управление строкой таким способом, как Вы запросили, является небольшим количеством работы, использующей просто Bash. Это выполнимо, но я нахожу, что Perl использования намного легче. Эта острота Perl сделает то, что Вы хотите также:
$ perl -a -F'\s*/\s*' -lne '
printf "%s / ", grep( /ABC/, @F );
printf "%s / %s / %s\n", grep( !/ABC/, @F );
' file
blablaABCbla / string1 / string2 / string3
Это решение предполагает, что 4 столбца отформатировали вход, и что ABC будет присутствовать. Можно инвертировать порядок printf...grep...
строки для получения ABC вначале (как показано) или в конце строки. Необходимо будет сделать несколько модификаций как так:
$ perl -a -F'\s*/\s*' -lne '
printf "%s / %s / %s / ", grep( !/ABC/, @F );
printf "%s\n", grep( /ABC/, @F );
' file
string1 / string2 / string3 / blablaABCbla
Я использую AWK (стандартная команда UNIX/Linux, что существует даже реализация Busybox) для проблемы как этот, например.
#!/bin/sh
awk -F'\t' 'BEGIN{srand()} {
X=$0
for(a=1;a<=NF;a++) {
if($a ~ /ABC/) {
if(rand() < .5) {
X = $a " " $0 # Concat strings
} else {
X = $0 " " $a
}
}
}
print X
}'
Как в стороне, я не думаю, что решение AWK является больше сложным, чем Python один:
#!/usr/bin/env python
import random
import re
import sys
for line in sys.stdin:
fields = re.split('\t',line[:-1])
out = line[:-1]
for field in fields:
if re.search('ABC',field):
if random.randint(0,1) == 1:
out = field + " " + line[:-1]
else:
out = line[:-1] + " " + field
print out
Однострочник bash может легко помочь -настроить этотоднострочник сравнения строк из другого ответа stackexchange-для вашей цели с помощью:
- adding “/“ to the field separator IFS
- assigning a fourth variable to the read command to match each of your “fields”
- test for your particular string “blabla…” and when that string is found
- echo your 4 variables in any preferred order (or even assign the result to a new variable)
- of course instead of a text file as input, you may want to use a pipe or a simple redirection as in: <<<${myinput[@]}