方法1では、「文字列名」で始まり、「文字列」で終わる行を検索します。

方法1では、「文字列名」で始まり、「文字列」で終わる行を検索します。

これは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

これはファイル全体をメモリにロードすることを意味しますが。

関連情報