как я могу использовать sed для замены списков, который начинается (*) в файле

“Большинство из них, кажется, различные предложения Nepomuk”. Но Вы уничтожили всех их, не только Nepomuk. Таким образом, некоторый другой процесс, должно быть, был пойман в драке — по-видимому, одно критическое для KDE, без который менеджер окон или разрушенный менеджер сеансов, возможно менеджер окон или сам менеджер сеансов.

Если Вы не вошли в, проверьте файл ~/.xsession-errors, это может иметь соответствующее сообщение около конца. Кроме этого, я не ожидаю, что Вы сможете найти полезные трассировки того, что происходит. В следующий раз проверьте то, что Вы уничтожаете перед уничтожением его.

4
07.11.2014, 20:55
6 ответов

Я бы использовал вместо этого Perl. Синтаксис для этого очень SIMLAR до SED :

perl -pe 's/^\*/$c++/e' file

или, чтобы начать с 1:

perl -pe 's/^\*/++$c/e' file

и для редактирования исходного файла на месте:

perl -i -pe 's/^\*/++$c/e' file
3
27.01.2020, 20:45

Вы можете использовать awk:

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

Я не могу придумать решение, которое использует только SED , но это близко. Он использует только SED , встроенные оболочки, а также CMP и MV . С некоторыми усилиями и современной оболочкой вы можете переписать это, чтобы сохранить содержимое файла в переменных оболочки, и не нужно использовать 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
1
27.01.2020, 20:45
{   tr -s \\n |
    sed =|
    sed '$!N;s/\n./ /'
} <<\INPUT
*linux

*computers

*labs

*questions
INPUT

OUTPUT

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=...... на терминал.

И действительно, для вашего простого примера, все это можно сделать с помощью nl и tr:

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

*computers

*labs

*questions
INPUT

OUTPUT

1 linux

2 computers

3 labs

4 questions
3
27.01.2020, 20:45

SED не может сделать расчеты, поэтому это невозможно с помощью полезного способа.

-3
27.01.2020, 20:45

Вы можете сыграть некоторую шутку - первые числовые строки с * только затем удалите * и пробелы , если хотите

nl -bp^[*] file | sed 's/^\s*\|\s*\*//g'
7
27.01.2020, 20:45

Теги

Похожие вопросы