2

これは私がやりたいことです:

みたいなパターンに遭遇したら

someVarX: val1

挿入したい

someVarY: val2

次の行で

...しかし、ここに問題があります:

someVarX: val1には、空白 (インデント) の前に 0 から N の間の任意の数を数えることができます。また、次の行でその正確なインデントを繰り返したいと考えています。したがって、someVarX: val1の前に 3 つの空白スペースがある場合、someVarY: val2にも前に 3 つの空白スペースが必要です。

これは私が試したものです:

s/\n( +)someVarX: val1/\n${1}someVarX: val1\n${1}someVarY: val2/

${1} が検索パターンのキャプチャ グループを置換文字列に挿入することを期待していましたが、次のようになりました。

sed: command garbled: ...

OS は SunOS 5.10 です。を実行できませんでしsed --versionた。オプション --version が不正であると表示されました。

何か案が?

4

4 に答える 4

6

入力が次のようになっていると仮定します。

<< EOF > infile
someVarX: val1
   someVarX: val1
 someVarX: val1
    someVarX: val1
EOF

次のように実行できます (GNU sed ERE でテスト済み):

<infile sed -r 's/^( *)someVarX: .*/&\n\1someVarY: val2/'

BRE とより移植性の高いオプションで同じこと (FreeBSD sed でもテスト済み):

sed '/^ *someVarX: .*/ { G; s/^\( *\)someVarX: .*/&\1someVarY: val2/; }' infile

出力:

someVarX: val1
someVarY: val2
   someVarX: val1
   someVarY: val2
 someVarX: val1
 someVarY: val2
    someVarX: val1
    someVarY: val2

sedが入力に改行を決して見^ないためではなく、行の先頭に正規表現を固定するために使用することに注意してください。行の先頭に常にスペースがある場合を除き、\nも使用します。*

置換のアンパサンド ( &) は一致全体に置き換えられ、後方参照 ( \1) は適切な量のスペースを挿入します。

于 2012-11-29T16:42:34.560 に答える
2

これが最終的に機能したものです。

        s/^\( *\)someVarX: val1/&\
\1someVarY: val2/

snrspec.sedこれは、sed S&Rスペックファイルの2行で実行する必要がありました。これを、他のS&R命令も含まれているとしましょう。

1,/^END/{
        s/ABC/XYZ/

        ...

        s/^\( *\)someVarX: val1/&\
\1someVarY: val2/

}

それから私はsedに電話しました:

sed -f snrspec.sed inputfile.txt > outputfile.txt

ただし、誰かが方法を知っている場合は、明らかによりエレガントになるため、1行で実行することをお勧めします。しかし、上記はうまくいき、私は大規模なS&R操作を実行しました。

于 2012-11-29T18:58:04.503 に答える
1

これはあなたのために働くかもしれません(GNU sed):

sed '/someVarX: val1/{h;G;s//someVarY: val2/2}' file
于 2012-11-29T20:25:16.133 に答える
1

これは、任意の sed で機能します。

sed -n 'p;s/^\([ \t]*\)someVarX: val1/\1someVarY: val2/p' file

さらに拡張可能なものが必要な場合は、 awk ソリューションを次に示します。

awk '1; /^[ \t]*someVarX: val1/{ sub(/[^ \t].*/,"someVarY: val2"); print}' file
于 2012-11-29T18:35:11.223 に答える