这是文件 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
尽管这意味着将整个文件加载到内存中。