10

###パターンを現在の行番号に置き換える必要があります。

AWK と SED の両方で、次の行で印刷することができました。

sed -n "/###/{p;=;}" fileなしで次の行に出力すると、行p;全体が置き換えられます。

sed -e "s/###/{=;}/g" file=;は一致したパターンの行番号を返すため、頭の中で意味をなしていましたが、テキストが返されます{=;}

私は何が欠けていますか? 私はこれがばかげた質問であることを知っています. sed マニュアルでこの質問に対する答えを見つけることができませんでした。明確ではありません。

可能であれば、私が欠けていたものと、それを機能させるものを教えてください。ありがとうございました

4

7 に答える 7

9

シンプルなawkワンライナー:

awk '{gsub("###",NR,$0);print}'
于 2012-09-19T15:11:58.137 に答える
5

コマンドの制限=を考えると、ジョブを 2 つ (実際には 3 つ) に分割する方が簡単だと思います。GNUsedを使用すると、次のことができます。

$ sed -n '/###/=' test > lineno

そして、次のようなもの

$ sed -e '/###/R lineno' test | sed '/###/{:r;N;s/###\([^\n]*\n\)\([^\n]*\)/\2\1/;tr;:c;s/\n\n/\n/;tc}'

コマンドsedと同様に、および GNU 拡張コマンドはファイルをパターン空間に読み込むのではなく、行を出力に直接追加するため、簡単な方法はありません。何らかの方法で変更されました。したがって、別のコマンドにパイプします。=rRsed

の内容test

fooo
bar ### aa
test
zz ### bar

上記が生成されます

fooo
bar 2 aa
test
zz 4 bar
于 2012-09-19T15:06:42.933 に答える
4

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

sed = file | sed 'N;:a;s/\(\(.*\)\n.*\)###/\1\2/;ta;s/.*\n//'

猫を使用した代替:

cat -n file | sed -E ':a;s/^(\s*(\S*)\t.*)###/\1\2/;ta;s/.*\t//'
于 2012-09-19T21:00:59.603 に答える
3

Lev Levitskyが指摘したように、これは sed の 1 回の呼び出しでは不可能です。これは、行番号が標準出力に直接送信されるためです。

sed で sed-script を作成し、2 つのパスで置換を行うことができます。

ファイル内

a
b
c
d
e
###
###
###
a
b
###
c
d
e
###

パターンを含む行を見つけます。

sed -n '/###/=' infile

出力:

6
7
8
11
15

それを sed-script にパイプして、新しい sed-script を作成します。

sed 's:.*:&s/###/&/:'

出力:

6s/###/6/
7s/###/7/
8s/###/8/
11s/###/11/
15s/###/15/

実行する:

sed -n '/###/=' infile | sed 's:.*:&s/^/& \&/:' | sed -f - infile

出力:

a
b
c
d
e
6
7
8
a
b
11
c
d
e
15
于 2012-09-19T15:26:54.323 に答える
1

これでよろしいですか ?

kent$  echo "a
b
c
d
e"|awk '/d/{$0=$0" "NR}1'
a
b
c
d 4
e

パターン「d」に一致する場合、行末に行番号を追加します。

編集

ああ、行番号を追加せずにパターンを置き換えたい...新しいコマンドを見てください:

kent$  echo "a
b
c
d
e"|awk '/d/{gsub(/d/,NR)}1'
a
b
c
4
e

また、この行は次のようにも記述できます。 awk '1+gsub(/d/,NR)' file

于 2012-09-19T14:50:15.780 に答える