Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用Sed或任何Unix命令匹配两个字符串之间的所有字符_Regex_Bash_Unix_Awk_Sed - Fatal编程技术网

Regex 使用Sed或任何Unix命令匹配两个字符串之间的所有字符

Regex 使用Sed或任何Unix命令匹配两个字符串之间的所有字符,regex,bash,unix,awk,sed,Regex,Bash,Unix,Awk,Sed,我有一个日志文件,我想删除日志文件中的所有com.test.data文本。在下面的示例中,我想删除所有粗体出现的文本 我想要的文本后面的新行造成了严重破坏,删除所有行\n将破坏整个.log文件 我试过grep-e'com.test.data'debug.log--color-v>test.log 还尝试了sed's/com.test.data-\(.*\)2016-01/\1/'debug.log>test.log 还尝试了sed'/'com.test.data-'/,/2016-01/s/[a

我有一个日志文件,我想删除日志文件中的所有com.test.data文本。在下面的示例中,我想删除所有粗体出现的文本

我想要的文本后面的新行造成了严重破坏,删除所有行\n将破坏整个.log文件

我试过
grep-e'com.test.data'debug.log--color-v>test.log

还尝试了
sed's/com.test.data-\(.*\)2016-01/\1/'debug.log>test.log

还尝试了
sed'/'com.test.data-'/,/2016-01/s/[a-z]*///p'debug.log>test.log

一切似乎都失败了

我的计划是查找'com.test.data-'和'2016-01'之间的所有文本,将所有文本替换为'empty'(全部删除)。 然后获取我的文件并使用grep为我提供除“com.test.data-”之外的所有行。 先这样做似乎能让我更接近

输入

或使用

sed 's/^2016-01/@/' debug.log > test.log //Add @ to beginning of file
现在只是从com.test.data中查找文本-->@

让事情变得更简单的新输入

@-05 14:45:05,264 com.test.data - blah blah blahsd

afdadfasdfsd
sdsdfsdffssfddsf

dfsdsfdfsdfdsdfs
fsdsdfdfs
@-05 14:46:05,264 com.test.rest - Testing 123
@-05 14:47:05,264 com.test.data - blah blah blahsd

afdadfasdfsd
sdsdfsdffssfddsf
dfsdsfdfsdfdsdfs

fsdsdfdfs
@-05 14:46:05,264 com.test.rest - Testing 123
输出

2016-01-05 14:46:05,264 com.test.rest - Testing 123

2016-01-05 14:46:05,264 com.test.rest - Testing 123

有什么想法吗?

您可以尝试以下方法:

sed -r -n '/^[0-9:, -]{24}com\.test\.data /{:a;n;/^[0-9:, -]{24}/!ba;/ com\.test\.data /ba;};p;' file

在某些unix系统中,
-r
选项不存在,并被
-E
(使用扩展正则表达式语法)

替换。此脚本通过输入循环,并记住以日期开头的最后一行是否包含
com.test.data
。如果没有,则打印该行

#!/bin/bash

re='^[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}'

printflag=1

while IFS= read -r line || [[ -n $line]]; do
    if [[ $line =~ $re ]]; then
        if [[ $line =~ com\.test.\data ]]; then
            printflag=0
        else
            printflag=1
        fi
    fi
    if (( printflag )); then
        echo "$line"
    fi
done < "$1"

打印带有测试123的行

awk '/Testing 123/' file
2016-01-05 14:46:05,264 com.test.rest - Testing 123
2016-01-05 14:46:05,264 com.test.rest - Testing 123

如果下面的脚本不能完全满足您的需要,那么应该可以很容易地根据您的需求对其进行调整。它还具有便携性、高效性和可维护性:

awk '
  BEGIN {ok=1}
  /^ *@-/ { if ($3 == "com.test.data") {ok=0; next} else {ok=1} }
  ok {print}'

请清楚地以原始形式发布输入,以及您希望输出如何显示。我想我现在明白了,但是添加一个所需输出的示例将非常有帮助。好的,我也会这样做。仍然不是非常清楚。除了空的那一行之外,再加上一行应该打印的行怎么样?到目前为止,这已经非常好了@BenjaminW。-sed's/^2016-01/@/'file.txt>test.log//Add@到文件开头。但是->aftered'/data/,/@/d'test.log>test2.log不工作。无法运行。sed-r-n'/^[0-9:,-]{24}com\.test\.data/{:a;n;/^[0-9:,-]{24}/!ba;/com\.test\.data/ba;};p'file.txt sed:非法选项--r用法:sed脚本[-Ealn][i扩展名][文件…]sed[-Ealn][i扩展名][e脚本]。。。[-f脚本文件]。。。[file…]@Thefirstkilla这意味着您可能没有GNU grep。您仍然可以在不使用
-r
的情况下使用它,但是您必须用
{24}
替换
{24}
.hmmph i havegrep(BSD grep)2.5.1-FreeBSD@BenjaminW.@Thefirstkilla是这样做的
sed-n'/^[0-9:,-]\{24\}com\\\.test data/{a;n;/^[0-9:,]{24\}ba\/{;p'文件
是否工作?@BenjaminW。不。sed:1:“/^[0-9:,-]\{24\}com\.t…”:意外的EOF(挂起的)非常接近,但应该有两行com.test.rest+//stackoverflow.sh file.txt输出->2016-01-05 14:46:05264 com.test.rest-测试123@Thefirstkilla当输入文件未以换行符终止时,可能会发生这种情况。我添加了一条语句,这样它也可以工作。我想OP也需要时间戳行之间的所有行,除非带有时间戳的行包含
com.test.data
。所示的示例有点不清楚,因为它只添加了一行空行。非常感谢Benjamin非常接近,但这很容易阅读,并且易于维护。在我将$3增加到$4以获得正确的分割后,对于可能有错误的真实错误日志,它的工作方式就像魔术一样。
awk '/Testing 123/' file
2016-01-05 14:46:05,264 com.test.rest - Testing 123
2016-01-05 14:46:05,264 com.test.rest - Testing 123
awk '
  BEGIN {ok=1}
  /^ *@-/ { if ($3 == "com.test.data") {ok=0; next} else {ok=1} }
  ok {print}'