2

我有一个日志,我想在正则表达式匹配文本中应用替换。

例如,使用这个日志行:

date machine  text random text and yet more random text - status code

我想在文本区域内用 _ 替换所有空格,而不替换日志中的所有其他空格。输出将是这样的:

date machine  text_random_text_and_yet_more_random_text - status code

为了匹配我要替换的区域,我有这个正则表达式:

/machine \(.*\) - /

由于文本不标准,我可以有一个空格到20,所以很难直接匹配它,所以我匹配子字符串的开始和结束。

尝试使用它我试过这个:

sed `/machine \(.*\) - /   s/ /_/g '  logfile

但当然,它将替换日志中的所有空格,而不仅仅是匹配的子字符串。

我设法用 awk 做到这一点,通过迭代和打印每个字段,直到我找到 . machineOFS="_"当我找到-. 它有效......但是,我很好奇这是否可以使用 sed 解决。

谢谢

4

5 回答 5

1

Since there are two space before text you like to have with underscore and space - space after, you can do like this:

awk -F "  | - " '/machine/ {gsub(/ /,"_",$2)}1' file
date machine text_random_text_and_yet_more_random_text status code
于 2013-10-10T19:47:09.960 回答
1

这可能对您有用(GNU sed):

sed -r 's/(\S+\s+){2}/&\n/;s/\s+-/\n&/;h;y/ /_/;G;s/.*\n(.*)\n.*\n(.*)\n.*\n/\2\1/' file
于 2013-10-10T19:57:28.260 回答
0

另一个 awk 解决方案可能是:

awk '{
    # Capture the stringpart in `a`rray
    match($0,"machine  (.*) -",a)
    # Make the changes
    gsub(" ","_",a[1])
    print gensub("machine (.*) -","machine  " a[1] " -","g")
}' INPUTFILE
于 2013-10-10T19:48:48.493 回答
0

这是一个解决此问题的 gnu-awk 命令:

s='date machine text random text and yet more random text - status code'
awk '{gsub(/ /, "_", $2); print $1 " machine " $2 " - " $3}' FS='machine *| *- *' <<<"$s"

date machine  text_random_text_and_yet_more_random_text - status code
于 2013-10-10T19:20:26.363 回答
0

珀尔:

echo "date machine  text random text and yet more random text - status code" | 
perl -pe 's/(?<=machine  )(.*)(?= - )/ ($repl = $1) =~ s{\s}{_}g; $repl /e'
date machine  text_random_text_and_yet_more_random_text - status code
于 2013-10-10T20:28:46.923 回答