0

/行ごとに多くの を含むファイルがあります。たとえば、次のようになります。

This/is/an/example.
This/is/another/example/to/read.
Read/this/example.
Last/example.

/各行の最初の出現箇所を\BEGINに、各行の最後の出現/箇所を\ENDに、残りのすべての出現箇所/をに置き換える必要があり\MIDDLEます。たとえば、上記のファイルは次のようになります。

This\BEGINis\MIDDLEan\ENDexample.
This\BEGINis\MIDDLEanother\MIDDLEexample\MIDDLEto\ENDread.
Read\BEGINthis\ENDexample.
Last\BEGINexample.

BASH または Linux で利用可能なその他のツールを使用して、この記号をこのように置き換えるにはどうすればよいgrepですか

4

3 に答える 3

4

私は使用します( Mac OSXで拡張正規表現sedが必要です):sed -E

sed -E 's/\//\\BEGIN/; s/\/([^/]+$)/\\END\1/; s/\//\\MIDDLE/g' 

最初のsコマンドにはg(グローバル)フラグがないため、最初に出現したものだけ/が置き換えられるため、機能します。2 番目sは によって最後のオカレンスを置き換え、最後$に最後の置換は残りのすべてのスラッシュを置き換えます。置換の順序は重要です。スラッシュが 1 つある場合は を取得//BEGINし、別のスラッシュがある場合は を取得します//END

于 2012-09-15T06:36:28.897 に答える
1

^([a-zA-Z]+)[](.*)[]([a-zA-Z]+)$ を grep して、 $1 /BEGIN $2 /END $3 に置き換えてみてください。

そして、すべての\をgrepし、/ MIDDLEでそれらをreplcaeします

于 2012-09-15T05:29:24.587 に答える
1
while IFS=/ read -a f; do (
    set -- "${f[@]}"
                    printf "$1"                       && shift
    (( $# ))     && printf "\\BEGIN$1"                && shift
    (( $# > 1 )) && printf "\\MIDDLE%s" "${@:1:$#-1}" && shift $(( $#-1 ))
    (( $# ))     && printf "\\\\END$1"
                    printf "\n"
    )
done < input.txt

入力は一度に 1 行ずつ読み取られ、各行が / 文字で分割され、結果がサブシェルの定位置パラメーターに格納されます。最初のフィールド (存在すると仮定) は無条件に出力され、残りの各フィールドは正しい区切り文字の前に出力されます。終了改行は無条件に出力されます。

(END に 2 つのバックスラッシュが必要な理由は完全にはわかりません。バックスラッシュがなければ、END の D だけを印刷しました。)

于 2012-09-15T16:11:47.137 に答える