これは3つの文を含むstrings.xmlファイルです。
1.string name="schedulelist_nofiles">登録スケジュールはありません!どうぞ、
ここに「Add」(追加)項目に欠落している行があります。ひも
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 PROGRAM 文字列
文3のように、「文字列名」で始まり、「文字列」で終わる完全な行を取得したいと思います。この問題についてどうすればよいですか?
答え1
以下のsed onelinerを使用して同じ目的を達成できます。テストしてみましたが、とてもうまくいきました。
最初の方法1
sed -n '/^string name.*string$/p' filename
方法1では、「文字列名」で始まり、「文字列」で終わる行を検索します。
方法2
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
これはファイル全体をメモリにロードすることを意味しますが。