特定のパターン間に現れるファイルの行を特定の長さに切り捨てるには? [閉鎖]

特定のパターン間に現れるファイルの行を特定の長さに切り捨てるには? [閉鎖]

@TESTパターンと有効化="true">の間の行だけを切り捨てる必要があるファイルがいくつかあります。一致するものがある場合@TESTとその間の文字列の長さはenabled="true">50文字でなければなりません。他のすべての行は変更されていないままにしてください。

例:

@TEST-TC_0010 @TEST RADIUSアカウントサーバーがRADIUSクライアントからアカウント要求パケットを受信したときにアカウント応答メッセージ"enabled = "true">を送信しないことを確認してください。

上記の行を以下のように変更する必要がありました。

@test-TC_0010@試験RADIUSアカウントサーバー有効="真">

ベストアンサー1

この場合、Perlツアーでgrepを使用できます。

grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile

「(?<=)」式は一致が始まる点を示し、「(?=)」式は一致が終わる点を示します。

".*" は grep に始点と終点の間のすべてを返すように指示します。

テスト入力を使用すると、上記の行は157文字を返します。

$ echo "Verify that the RADIUS accounting server should not send the Accounting-Response Message on Receiving the Accounting-Request Packet from the RADIUS Client" | wc -m
157

最初の50文字までをさらに切り捨てるには、cutを使用できます。

$ grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile | cut -c1-50
Verify that the RADIUS accounting server should no

結果をファイルに保存するには、出力を別のファイルにパイプする必要があります。次のようなものを使用できます...

$ grep -oP '(?<=@TEST ).*(?=\" enabled=\"true\")' inputfile | cut -c1-50 >> outputfile

ある時点で元のデータを使用する必要があるため、個人的に入力ファイルを上書きすることはお勧めできません。

したがって、ファイル内の他のすべての項目を保持し、有効化="true"の行だけを切り捨てる必要がある場合は、ツールをawkに変更する必要があります。

$ awk  -F'@TEST' '{if (/true/) print substr($3,2,50); else print $0}' inputfile >> outputfile

このオネライナーは、変更なしで真と一致しないすべての行を出力します。 trueが一致すると、行は50文字に切り捨てられます。もう一度申し上げますが、結果を出力ファイルに渡すために元のデータを上書きしないことをお勧めします。

質問に対するOPの最新の編集に基づいて、Beginnerによって提供された出力を複製するためにawk 1行ステートメントを修正しました。彼はawkがうまくいかないというコメントに言及しました。 OPがawkが機能しない理由の詳細を提供する前に、Ubuntu 16.04でawk 4.1.3を使用すると、次の行はこれまでの詳細な結果を返します。

awk  -F'@TEST' '{if (/true/) print "@TEST"$2,"@TEST",substr($3,2,50),"enabled=\"true\">"; else print $0}' inputfile >> outputfile

おすすめ記事