0

調査を行いましたが、問題の解決策を見つけることができませんでした。文字列内のすべての有効な単語 (文字で始まる) を抽出し、それらをアンダースコア ("_") で連結しようとしています。awk、sed、grep などで解決策を探しています。

何かのようなもの:

echo "The string under consideration" | (awk/grep/sed) (pattern match)

例 1

入力:

1.2.3::L2 Traffic-house seen during ABCD from 2.2.4/5.2.3a to 1.2.3.X11

望ましい出力:

L2_Traffic_house_seen_during_ABCD_from

例 2

入力:

XYZ-2-VRECYY_FAIL: Verify failed - Client 0x880016, Reason: Object exi

望ましい出力:

XYZ_VRECYY_FAIL_Verify_failed_Client_Reason_Object_exi

例 3

入力:

ABCMGR-2-SERVICE_CRASHED: Service "abcmgr" (PID 7582) during UPGRADE

望ましい出力:

ABCMGR_SERVICE_CRASHED_Service_abcmgr_PID_during_UPGRADE
4

4 に答える 4

2

これはうまくいくかもしれません(GNU sed):

sed 's/[[:punct:]]/ /g;s/\<[[:alpha:]]/\n&/g;s/[^\n]*\n//;s/ [^\n]*//g;y/\n/_/' file
于 2012-07-19T10:13:46.030 に答える
1

を使用する1つの方法awk、の内容script.awk

BEGIN {
    FS="[^[:alnum:]_]"
}

{
    for (i=1; i<=NF; i++) {
        if ($i !~ /^[0-9]/ && $i != "") {
            if (i < NF) {
                printf "%s_", $i
            }
            else {
                print $i
            }
        }
    }
}

次のように実行します:

awk -f script.awk file.txt

または、ここに1つのライナーがあります。

awk -F "[^[:alnum:]_]" '{ for (i=1; i<=NF; i++) { if ($i !~ /^[0-9]/ && $i != "") { if (i < NF) printf "%s_", $i; else print $i; } } }' file.txt

結果:

L2_Traffic_house_seen_during_ABCD_from_to_X11
XYZ_VRECYY_FAIL_Verify_failed_Client_Reason_Object_exi
ABCMGR_SERVICE_CRASHED_Service_abcmgr_PID_during_UPGRADE
于 2012-07-19T11:22:13.927 に答える
1

perlワンライナー。任意の英字に続いて、単語境界で囲まれた任意の数の単語文字が検索されます。フラグを使用して/g、各行でいくつかの一致を試みます。

の内容infile:

1.2.3::L2 Traffic-house seen during ABCD from 2.2.4/5.2.3a to 1.2.3.X11
XYZ-2-VRECYY_FAIL: Verify failed - Client 0x880016, Reason: Object exi
ABCMGR-2-SERVICE_CRASHED: Service "abcmgr" (PID 7582) during UPGRADE

Perl指図:

perl -ne 'printf qq|%s\n|, join qq|_|, (m/\b([[:alpha:]]\w*)\b/g)' infile

出力:

L2_Traffic_house_seen_during_ABCD_from_to_X11
XYZ_VRECYY_FAIL_Verify_failed_Client_Reason_Object_exi
ABCMGR_SERVICE_CRASHED_Service_abcmgr_PID_during_UPGRADE
于 2012-07-19T10:25:44.493 に答える
0

このソリューションにはいくつかの調整が必要であり、「レコード区切り」として正規表現を使用するには gawk が必要だと思います http://www.gnu.org/software/gawk/manual/html_node/Records.html#Records
gawk -v ORS='_' -v RS='[-: \"()]' '/^[a-zA-Z]/' file.dat

于 2012-07-19T10:07:56.960 に答える