sedを使用してファイル内の(*)で始まるリストを置き換える方法

sedを使用してファイル内の(*)で始まるリストを置き換える方法

sedアスタリスクで始まる行をどのように変更し、1から始まる数字に置き換えますか?

リストの先頭の(*)を数字に置き換えるには、sedを使用する必要があります。>

ファイルにリストが含まれています。

*linux

*computers

*labs

*questions

>>>>に行く

ファイルにリストが含まれています。

1 linux
2 computers
3 labs
4 questions

使ってみよう

sed -e 's/*//' file.in > file.out | sed -i = file.out

答え1

awkを使用できます。

awk '/^\*/ {sub(/\*/, ++i)} 1' <<END
A list
* one
* two
Blah
* three
END
A list
1 one
2 two
Blah
3 three

答え2

いくつかのトリックが利用可能です。垂直線を最初に使用し、必要に応じて*削除*します。spaces

nl -bp^[*] file | sed 's/^\s*\|\s*\*//g'

答え3

{   tr -s \\n |
    sed =|
    sed '$!N;s/\n./ /'
} <<\INPUT
*linux

*computers

*labs

*questions
INPUT

出力

1 linux
2 computers
3 labs
4 questions

nl最も明確ですが、sed行数を計算できます。sedこのことは一人ではありません。

sh <<HD
$(sed -n 's/^\*\(.*\)/echo "$LINENO \1"/p' <infile)
HD

...または...

sed -n "s/..*/OUT='&'/p" <infile | 
PS1='${LINENO#0} ${OUT#?}${IFS#??}' dash -i

...両方とも以前と同じように印刷されます。(少し愚かだが)。基本的には同様のターミナルリーダーをdash有効にしないため、ここでは明示的に使用しています。それがあなたのものでreadlineあれば単に使用できますが、リンクされている場合は端末にもコンテンツが印刷されないように2番目の例を使用する必要があります。dashshshbashsh--noeditingOUT=...

実際に簡単な例では、以下を使用してすべての操作をnl実行できますtr

tr -d \* <<\INPUT| nl -s ' ' -w1 -nln
*linux

*computers

*labs

*questions
INPUT

出力

1 linux

2 computers

3 labs

4 questions

答え4

私は使用専用の解決策を思い出すことができませんでしたが、sedほぼ同じです。 、シェルsed内蔵cmpmv。少しの努力と最新のシェルを使用すると、それをオーバーライドして、またはを使用cmpせずにファイルの内容をシェル変数に保存できますmv

#!/bin/sh
if test $# -ne 1
then
    echo usage: $0 file
    exit 1
fi
num=1    # start numbering at 1
infile="$1"
outfile="$1.out"
mv "$infile" "$outfile"    # set up so initial cmp always fails
while ! cmp -s "$infile" "$outfile" # repeat the sed until no more ^* can be found
do
    mv "$outfile" "$infile"
    # replace the first occurrence of ^* with a number and a space
    sed '0,/^\*/s//'$num' /' "$infile" > "$outfile" 
    num=$(expr $num + 1)
done
rm "$outfile"

テスト:

$ cat i
first line
*second
*third
fourth
*fifth
$ ./change i
$ cat i
first line
1 second
2 third
fourth
3 fifth

関連情報