1

次のテキストを含む長い行 (1 行あたり 5000 ~ 10000 文字) の巨大な XML ファイルがあります。

Pattern="abc"

そして私はそれを

Pattern="def"

ラインサイズが大きいので、仕方なくawkを使います。これを達成する方法を提案してください。以下で試しましたが、うまくいきません。

CMD="{sub(\"Pattern=\"abc\"\",\"Pattern=\"def\"\"); print}"
echo "$CMD"
awk "$CMD" "Some File Name.xml"

どんな助けでも大歓迎です。

4

3 に答える 3

2

なぜ「回線サイズが大きいので、awkを使わざるを得ない」と言うのか理解できません。AFAIK sed は awk よりも行の長さに制限がありません。これは単一行での単純な置換であるため、sed がより適切なツールの選択です。

$ cat file
Pattern="abc"
$ sed -r 's/(Pattern=")[^"]+/\1def/' file
Pattern="def"

パターンが行に複数回出現する場合は、行末に「g」を追加します。

コメントで、長い行を処理できない sed で立ち往生していると述べているので、GNU ツールをインストールできないと仮定して、次のような非 GNU awk ソリューションが必要になるとします。

$ awk '{sub(/Pattern="[^"]+/,"Pattern=\"def")}1' file
Pattern="def"

文字通り、交換したいだけの場合は、次のようPattern="abc"にします。

$ awk '{sub(/Pattern="abc"/,"Pattern=\"def\"")}1' file
Pattern="def"
于 2013-06-17T13:02:55.387 に答える
0

あなたがを持っているなら、これを試すことができます:

長い行 (>10_000 文字) を含むファイルを作成します。

for((i=0;i<2500;++i));{ s="x$s";}
l="${s}Pattern=\"abc\"$s"
for i in {1..5}; { echo "$l$l";} >infile

スクリプト:

while read x; do echo "${x//Pattern=\"abc\"/Pattern=\"def\"}";done <infile

これにより、各行のすべてのPattern="abc"toが置き換えられます。Pattern="def"

于 2013-06-17T14:02:59.893 に答える