Идентификация и движущиеся поля в строке

Причина состоит в том, потому что существует два типа вывода.

  • Нормальный вывод (STDOUT)
  • Вывод ошибок (STDERR)

cvs --help печатает информацию о справке к STDERR. Канал (|) ожидает данные, которые были записаны в STDOUT так, чтобы это могло быть считано STDIN.

Для получения текста справки от STDERR кому: STDOUT (так, чтобы это было читаемо каналом), необходимо перенаправить его.

cvs --help 2>&1 | less

Дальнейшее объяснение здесь.

0
03.02.2014, 01:33
3 ответа

Управление строкой таким способом, как Вы запросили, является небольшим количеством работы, использующей просто 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
2
28.01.2020, 02:20

Я использую 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
2
28.01.2020, 02:20

Однострочник 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[@]}
0
08.02.2021, 03:23

Теги

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