Заполните нулями числа к 2 цифрам с sed

При создании символьной ссылки на относительный путь это сохранит его как относительную символьную ссылку, не абсолютную как шоу в качестве примера. Это обычно - хорошая вещь. Абсолютные символьные ссылки не работают, когда файловая система смонтирована в другом месте.

Причина Ваш пример не работает, состоит в том, что это относительно родительского каталога символьной ссылки и не где ln выполняется.

Можно сделать:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Или для этого вопросы:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

Важно понять что первый аргумент после ln -s хранится как цель символьной ссылки. Это может быть любая произвольная строка (с единственными ограничениями, что это не может быть пусто и не может содержать символ NUL), но в то время, когда символьная ссылка используется и разрешается, та строка понята как относительный путь к родительскому каталогу символьной ссылки (когда это не запускается с /).

19
12.03.2011, 17:11
4 ответа
$ sed 's/\<[0-9]\>/0&/' ./infile
201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG
13
27.01.2020, 19:45
  • 1
    Можно ли объяснить, как это работает? Это - первый раз, когда я смотрю на \<[0-9]\> создайте, который я думаю, одно ответственное за соответствие единственным цифрам, но не уверенный, чем называют эту конструкцию.Спасибо. –  sasuke 12.03.2011, 15:16
  • 2
    \<средства: запустите 'слова'... [0-9] означает единственную цифру от 0 до 9... \> средства: конец 'слова'... слово: маркер, который является разграниченным пробелом (или начинает/заканчивает в, запускает/заканчивает строки, для \<и \> соответственно)... PS. Я просто попробовал знаки пунктуации.. они - также разделители. –  Peter.O 12.03.2011, 15:46
  • 3
    Можно также сделать это, не получая круглые скобки: & в замещающей строке будет использовать подобранный LHS- sed 's/\<[0-9]\>/0&/' –  glenn jackman 12.03.2011, 16:33
  • 4
    О, не знало это <> граница слова в оболочке regex синтаксис. Задумайтесь о нем, даже 'sed 's/\b [0-9], \b/0& /' также работает. Спасибо вам обоим. :) –  sasuke 12.03.2011, 17:18
  • 5
    @sasuke: <> функция расширенного regex (не оболочки, как таковой)..., в зависимости от которой версии, и который опции Вы используете, sed и shell может оба использовать или расширенный или стандарт regex... стандарт regex использование \<\> –  Peter.O 12.03.2011, 19:19

Другое решение: awk '{$2 = sprintf("%02d", $2); print}'

18
27.01.2020, 19:45

Вот (non-sed) способ использовать удар с расширенным regex..
Этот метод, позволяет объему делать более сложную обработку отдельных строк. (т.е. больше, чем просто regex замены)

while IFS= read -r line ; do
    if [[ "$line" =~ ^(.+\ )([0-9]\ .+)$ ]]  
    then echo "${BASH_REMATCH[1]}0${BASH_REMATCH[2]}" 
    else echo "$line"
    fi
done <<EOF
201103 1 /mnt/hdd/PUB/SOMETHING
201102 7 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 3 /mnt/hdd/PUB/SOMET HING
201106 1 /mnt/hdd/PUB/SOMETHI NG
EOF

вывод:

201103 01 /mnt/hdd/PUB/SOMETHING
201102 07 /mnt/hdd/PUB/SOMETH ING
201103 11 /mnt/hdd/PUB/SO METHING
201104 03 /mnt/hdd/PUB/SOMET HING
201106 01 /mnt/hdd/PUB/SOMETHI NG
2
27.01.2020, 19:45
while read a b c
do 
new_format=$(printf "%02d" $b)
echo "$a $new_format $c"
done </tmp/input
-1
27.01.2020, 19:45

Теги

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