“Большинство из них, кажется, различные предложения Nepomuk”. Но Вы уничтожили всех их, не только Nepomuk. Таким образом, некоторый другой процесс, должно быть, был пойман в драке — по-видимому, одно критическое для KDE, без который менеджер окон или разрушенный менеджер сеансов, возможно менеджер окон или сам менеджер сеансов.
Если Вы не вошли в, проверьте файл ~/.xsession-errors
, это может иметь соответствующее сообщение около конца. Кроме этого, я не ожидаю, что Вы сможете найти полезные трассировки того, что происходит. В следующий раз проверьте то, что Вы уничтожаете перед уничтожением его.
Я бы использовал вместо этого Perl. Синтаксис для этого очень SIMLAR до SED
:
perl -pe 's/^\*/$c++/e' file
или, чтобы начать с 1:
perl -pe 's/^\*/++$c/e' file
и для редактирования исходного файла на месте:
perl -i -pe 's/^\*/++$c/e' file
Вы можете использовать awk:
awk '/^\*/ {sub(/\*/, ++i)} 1' <<END
A list
* one
* two
Blah
* three
END
A list
1 one
2 two
Blah
3 three
Я не могу придумать решение, которое использует только 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
{ 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=......
на терминал.
И действительно, для вашего простого примера, все это можно сделать с помощью nl
и tr
:
tr -d \* <<\INPUT| nl -s ' ' -w1 -nln
*linux
*computers
*labs
*questions
INPUT
1 linux
2 computers
3 labs
4 questions
SED
не может сделать расчеты, поэтому это невозможно с помощью полезного способа.
Вы можете сыграть некоторую шутку - первые числовые строки с *
только затем удалите *
и пробелы
, если хотите
nl -bp^[*] file | sed 's/^\s*\|\s*\*//g'