Как заменить строку, содержащую только --------, на ||| - PullRequest
0 голосов
/ 17 января 2011

У меня есть что-то вроде:

------------------------------------------------------------------------
r2 | username | 2011-01-16 16:52:23 +0100 (Sun, 16 Jan 2011) | 1 line
Changed paths:
   D /foo
Removed foo
------------------------------------------------------------------------
r1 | username | 2011-01-16 16:51:03 +0100 (Sun, 16 Jan 2011) | 1 line
Changed paths:
   A /foo
created foo
------------------------------------------------------------------------

Моя цель состоит в том, чтобы идентифицировать файл, добавленный «именем пользователя» в конкретную дату. Таким образом, мне нужно иметь комбинацию (имя пользователя, 16 января 2011 г., A), чтобы убедиться, что это правильный файл и затем вывести foo. Моя идея состоит в том, чтобы:

  1. удалить пробелы
  2. изменить символы новой строки на |
  3. избавиться от --------------- и заменить их на новые строки

но проблема в том, что я не смог заменить -------, так как они смешаны с другими символами.

----------------------------------------------------------------------
|r2|username|2011-01-1616:52:23+0100(Sun,16Jan2011)|1line|Changedpaths:|D/foo|Removedfoo|
------------------------------------------------------------------------
|r1|username|2011-01-1616:51:03+0100(Sun,16Jan2011)|1line|Changedpaths:|A/foo|createdfoo|
------------------------------------------------------------------------

Так что я подумал, что было бы неплохо начать с замены --------------- на специальный символ, такой как ||| а затем измените этот символ с помощью новой строки, используя awk FS = ||| OFS = \ п Может кто-нибудь мне помочь! спасибо

Ответы [ 3 ]

1 голос
/ 17 января 2011
gawk 'BEGIN{FS="\n";RS="--+"} {$1=$1}RT' OFS="|"  file
0 голосов
/ 17 января 2011

Как насчет следующего,


#! /bin/sh

if [ "$#" != '3' ] ; then
    echo "usage $0 logfile username date"
    exit 1
fi

cat "$1" | awk '
BEGIN{
    FS="|";
}

/------------------------------------------------------------------------/{
    username="";
    date="";
    next;
}

/^r[0-9]+/{
    username = gensub(/^ *(.*[^ ]) *$/, "\\1", "", $2);
    date = gensub(/^ *(.*[^ ]) *$/, "\\1", "", $3);
    next;
}

/^created /{
    filename = gensub(/^created /, "", "", $0);
    if ( username == "'"$2"'" && date == "'"$3"'" ) {
        print filename;
    }
}
'

Если на входных данных выполняется следующее,

$ ./script data username '2011-01-16 16:51:03 +0100 (Sun, 16 Jan 2011)'

вывод

foo

Надеюсь, это поможет, - Люк

0 голосов
/ 17 января 2011
awk '/^-+$/{print a[i++];next}!/^-+$/{gsub(/ /,"");a[i]=a[i] "|" $0}' infile

Выход

$ awk '/^-+$/{print a[i++];next}!/^-+$/{gsub(/ /,"");a[i]=a[i] "|" $0}' ./infile

|r2|username|2011-01-1616:52:23+0100(Sun,16Jan2011)|1line|Changedpaths:|D/foo|Removedfoo
|r1|username|2011-01-1616:51:03+0100(Sun,16Jan2011)|1line|Changedpaths:|A/foo|createdfoo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...