Regex 我怎样才能将只包含--------的行替换为|||
我有点像:Regex 我怎样才能将只包含--------的行替换为|||,regex,sed,awk,Regex,Sed,Awk,我有点像: ------------------------------------------------------------------------ r2 | username | 2011-01-16 16:52:23 +0100 (Sun, 16 Jan 2011) | 1 line Changed paths: D /foo Removed foo ----------------------------------------------------------------
------------------------------------------------------------------------
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
------------------------------------------------------------------------
我的目标是识别在特定日期由“用户名”添加的文件。因此,我需要有组合(用户名,2011年1月16日,A),以确保它是正确的文件,然后打印foo。
我的想法是:
----------------------------------------------------------------------
|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=\n换行符来更改这个字符
谁能帮帮我!
谢谢
输出
下面呢,
#! /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)'
$./脚本数据用户名'2011-01-16 16:51:03+0100(Sun,2011年1月16日)'
输出是
foo
福
希望有帮助,
-Luke如果你想用换行符替换
-
字符串,那么为什么不先用换行符替换它们而不是一个特殊字符?-+
找到长破折号行,你能显示你的正则表达式吗?cat file.txt | awk'BEGIN{RS=”“;FS=“\n”}{print$i}awk'BEGIN RS=“\RS=“\n”{If($0~用户名){print$0}|tr-d | sed:a,;N、 美元!文学士;s/\n/|/g'@mimou好的,gensub需要gawk
(GNU Awk)。“我会重写它,使它不再需要它。@mimou将答案更新为“不需要”gawk
非常简洁,我是gusta。你没有像OFS一样在BEGIN之外抛出FS
和RS
的任何原因?还有,RT
是一种呆板主义吗?最后,它需要一点gsub
love来满足“删除空格”的要求。OFS也可以在BEGIN内部。RT是一个呆滞的特性。至于删除空格,我没有达到这个要求。但我真的不明白他为什么要这么做。无论如何……如果需要删除空格,那么是的,一点gsub就可以了
#! /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