在外壳中搜索字符串,如果找不到则打印换行

时间:2018-11-04 07:50:05

标签: bash shell

我有输出命令:

Test TXT some Text1
Test TXT some Text2
Done TXT some Text3
Done TRT some Text1
Test TXT copy Text5
Done TXT some Text2
Test TRT many Text4
Test TRT some Text6
Done TXT many Text9

我想搜索“ TXT”,如果找到,则打印其余行。如果找不到,请打印如下空白行:

some Text1
some Text2
some Text3

copy Text5
some Text2


many Text9

如何在不使用sed或awk的情况下执行此操作?

4 个答案:

答案 0 :(得分:0)

这应该做到。

if [[ "$line" == *TXT* ]]; then
    echo "$line"
else
    echo ""
fi

或更短:

[[ "$line" == *TXT* ]] && echo "$line" || echo ""

编辑:是的,那样做。

$ while read line; do [[ "$line" == *TXT* ]] && echo "$line" || echo "" ; done <test.txt
Test TXT some Text1
Test TXT some Text2
Done TXT some Text3

Test TXT copy Text5
Done TXT some Text2


Done TXT many Text9

答案 1 :(得分:0)

在您的问题中,您写“如何不使用sed来完成此操作” ,但在@Cyrus的回答下方,您写“我不能使用{{1} },我们只能使用awk来做到这一点吗?”

如果您要使用的是sed解决方案,则只需使用:

sed

使用/输出示例

使用文件sed '/TXT/!s/^.*$//' file | sed '/TXT/s/^.*TXT[ ]//' ,您将得到以下信息:

file

说明

  • $ sed '/TXT/!s/^.*$//' file | sed '/TXT/s/^.*TXT[ ]//' some Text1 some Text2 some Text3 copy Text5 some Text2 many Text9 查找包含sed '/TXT/!s/^.*$//' file的所有行 not (例如'!'),并简单地将它们设为空;
  • 用管道输送到TXT,然后找到所有带有sed '/TXT/s/^.*TXT[ ]//'的行,并从该行的开头修剪到"TXT"(消除"TXT "之后的space。 / li>

仔细检查一下,如果还有其他问题,请告诉我。

答案 2 :(得分:0)

这里是使用perl和非贪婪正则表达式(.*?)而不是sed或awk的一种:

$ perl -pe 's/.*?(TXT |$)//' file
some Text1
some Text2
some Text3

copy Text5
some Text2


many Text9

它将删除(以非贪婪方式替换为空)到TXT的末尾或行($的末尾)。

答案 3 :(得分:0)

这是一个绝对糟糕的答案。我很惊讶它起作用。我将其发布在这里,希望有人能够告诉我它为什么起作用。我不明白的部分是为什么出现空白行-毕竟,没有'TXT'分隔符的行不匹配任何模式,也不应该提供任何输出(或我认为):

awk -F'TXT ' '{print $2}'

这是测试:

awk -F'TXT' '{print $2}' <<EOF
> Test TXT some Text1
> Test TXT some Text2
> Done TXT some Text3
> Done TRT some Text1
> Test TXT copy Text5
> Done TXT some Text2
> Test TRT many Text4
> Test TRT some Text6
> Done TXT many Text9
> EOF
some Text1
some Text2
some Text3

copy Text5
some Text2


many Text9

糟糕。刚刚看到'awk'和'sed'都是僵尸。

这是对另一个帖子的修改,可以解决该问题。我添加了一些代码以删除所有内容,包括'TXT':

while 
  read line
do
[[ "$line" == *TXT* ]] && echo "${line#*TXT }" || echo ""
done

请将此问题的正确答案归功于UtahJarhead。 UtahJarhead的响应只需要使用此结构“ $ {line#* TXT}”来删除直到“ TXT”的最短前缀。