在方法1中它将搜索以“字符串名称”开头并以“字符串”结尾的行

在方法1中它将搜索以“字符串名称”开头并以“字符串”结尾的行

这是文件 strings.xml,其中包含 3 句话:

1.string name="schedulelist_nofiles">不存在注册议程!拜托,

这里缺少一行 tecla“Add”(Adicionar)para adicionar uma。细绳

2.你应该跳过这一行!

3.string name="Programme_name">GUIA DE PROGRAMA 字符串

我使用 cat 命令 'cat strings.xml | grep "string name=" 但它只得到以下几行:

string name="schedulelist_nofiles">不存在注册议程!拜托,

string name="Programme_name">GUIA DE PROGRAMA 字符串

我想得到这样的完整行,就像第3句一样,以“字符串名称”开头,以“字符串”结尾。为此我能做什么呢?

答案1

下面可以使用 sed oneliner 来实现同样的目的。测试了一下效果很好

第一种方法1

sed -n '/^string name.*string$/p'  filename

在方法1中它将搜索以“字符串名称”开头并以“字符串”结尾的行

方法二

sed -n '/^string name/p' filename | sed -n '/string$/p'

在方法2中,首先它将搜索以“字符串名称”开头的行,然后搜索以字符串结尾的行

输出

string name="Programme_name">GUIA DE PROGRAMA string

答案2

对于sed,假设它们string name= ... string占据整行并且所有string name=s 都以 结尾string

sed '
  /^string name=/!d
  :1
  / string$/!{
    N
    b1
  }' < strings.xml

答案3

pcregrep

pcregrep -Mo '(?s)\bstring name=.*?\bstring\b' < file.xml
  • -M:多行模式,其中 pcregrep 根据需要从输入中提取更多行以满足正则表达式
  • -o:打印与 GNU 中的正则表达式匹配的部分(如果正则表达式与整行匹配,则grep可以省略它或替换为。-x
  • (?s):激活导致在换行符上也匹配的s标志.
  • .*?:非贪婪版本.*:任意数量的字符,尽可能少。
  • \b:字边界。

如果你没有pcregrep,你可以用类似的方法做同样perl的事情:

perl -l -0777 -ne 'print for /\bstring name=.*?\bstring\b/gs' < file.xml

尽管这意味着将整个文件加载到内存中。

相关内容