如何使用 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类似的终端阅读器。如果dash是你的,sh你可以只使用sh,但如果bash链接到sh你将需要使用--noediting第二个示例,以避免它OUT=...也将内容打印到终端。

实际上,对于您的简单示例案例,整个事情可以用nland完成tr

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

*computers

*labs

*questions
INPUT

输出

1 linux

2 computers

3 labs

4 questions

答案4

我无法想出一个仅使用 的解决方案sed,但这已经很接近了。它仅使用sed、shell 内置命令cmpmv。通过一些努力和现代 shell,您可以重写它以将文件内容保存在 shell 变量中,而不必使用cmpor 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

相关内容