Как преобразовать штриховую строку в пробелы и ограничения?

[113701] Как насчет grep?

1
09.12.2014, 02:16
6 ответов

Если эта строка является частью файла или вывода:

sed 's/foo-bar/Foo Bar/g' file

Предполагая, что в строке нет «странных» символов ( / , \ , : ):

string="foo-bar"
set -- $(echo "${string//-/ }")
replstr="$(for word in $*; do echo -n "${word^} "; done)"
replstr="${replstr% }"
sed "s/${string}/${replstr}/g' file
0
27.01.2020, 23:15

Один раствор с использованием , не ограничивается только кодом «Foo-Bar»

$ cat file
aaa-zzz-eee-rrr
foo-bar

$ perl -ne 'print join " ", map { ucfirst } split /-/' file
Aaa Zzz Eee Rrr
Foo Bar

Другое решение с использованием чистого Bash

while IFS='-' read -r -a words; do
    printf '%s\n' "${words[@]^}" | paste -sd ' '
done < file

выхода:

Aaa Zzz Eee Rrr 
Foo Bar
1
27.01.2020, 23:15

Начните с изменения тире в пробелы, как: SED 'S / / / G'

Утверждение первой буквы уже решено (идите их UPVote; или просто отметьте этот вопрос дубликат этого).

Затем комбинируйте их: SED-E / - / / G '-S / \ B \ (. \) / \ U \ 1 / g'

$ echo "foo-bar-baz-nonce" | sed -e 's/-/ /g' -e 's/\b\(.\)/\u\1/g'
Foo Bar Baz Nonce
$ 
2
27.01.2020, 23:15

в Bash

v=foo-bar && v=$(IFS=- read -ra x <<<"$v"; printf '%s' "${x[*]^}") && printf '%s\n' "$v"
Foo Bar

в Python

v=foo-bar python -c 'import os, string
print string.capwords(" ".join(os.environ["v"].split("-")))
'
Foo Bar
0
27.01.2020, 23:15

Шаг 1: Замените - на пробел

Для этого можно использовать команду tr следующим образом:

tr "-" "

Шаг 2: Сделайте первую букву каждого слова заглавной

Для этого используйте \b и сразу сделайте букву заглавной. . представляет собой прямую букву за границей слова \b, \U делает ее заглавной и & сохранит все остальные буквы в том виде, в каком они были.

sed -e 's/\b./\U&/g'

Check:

echo "foo-bar-foo-bar" | tr "-" " " | sed -e 's/\b./\U&/g'
Foo Bar Foo Bar
1
27.01.2020, 23:15

В качестве дополнения к ответу Роланда Иллига можно написать программу, которая, получив разрешения root, повреждает системные файлы и/или компрометирует вашу систему различными способами.

Проблема в том, что просто написание не означает, что он автоматически запускается как root - ему нужно установить владельца на root, а затем должен быть набор бит setuid, на который ссылается Роланд - и только root имеет право на это.

Короче говоря: Да, каждый двоичный файл с битовым набором setuid является, по крайней мере, потенциально угрозой безопасности. Использование ошибки в двоичном файле с поддержкой setuid для получения привилегий root является наиболее распространенным источником так называемых атак эскалации привилегий , и они, как правило, имеют большое значение, когда они происходят. Из-за этого, есть относительно мало частей программного обеспечения, которые используют setuid, и те, которые существуют, как правило, находятся под высоким контролем.

-121--59390-

Я думаю, что вам не нужно переименовывать файлы. Можно преобразовать имена файлов на лету (первый sed), сравнить их с датой (awk) и преобразовать соответствующие имена файлов обратно (второй sed).

find parent/directory -maxdepth 1 -type d -name 'bkp_*'                | \
sed 's#parent/directory/bkp_\(..\)\(..\)\(....\)#\3\2\1#'              | \
awk -v date=$(date --date='3 months ago' +%Y%m%d) '$0<$date{print $0}' | \
sed 's#\(....\)\(..\)\(..\)#parent/directory/bkp_\3\2\1#'              | \
xargs rm -r

Вы должны сначала протестировать это без компонента xargs rm!

-121--139844-

Для расщепления в оболочке POSIX можно сделать:

set -f; IFS=-; set -- $1; IFS=' '

Теперь все ваши штрихи мест и вы можете иметь весь ряд в «$ *» или еще каждый космос - ранее тире - разделённый ряд в $1 $2 $3 ... (общее количество которых доступно в «$ #» ) или можно получить в качестве расширяемого аргумента перечислять в «$ @» .

Теперь, в случае преобразования вы можете сделать:

IFS='
'; for c in $(printf %.1s "$@" | dd cbs=1 conv=unblock,ucase)
do set -- "$@" "$c${1#[!"$IFS"]}"; shift; done

Вот вся вещь на примере:

set -f -- aaa-zzz-eee-rrr-foo-bar
IFS=-; set -- $1; IFS=' 
'; for c in $(printf %.1s "$@" | dd cbs=1 conv=unblock,ucase)
do set -- "$@" "$c${1#?}"
shift; done; printf %s\\n "$@"

, который печатает:

Aaa
Zzz
Eee
Rrr
Foo
Bar

... который не пространственно разделен я знаю - я использовал «$ @» . Он разделен пробелом в «$ *» , поскольку первый байт $ IFS имеет значение космоса - разделитель определяется в этом пути. Например:

IFS=k; printf %s\\n "$*"; IFS=' '; printf %s\\n "$*"

... который печатает...

AaakZzzkEeekRrrkFookBar
Aaa Zzz Eee Rrr Foo Bar

Вы можете сохранить его в любое время:

IFS=-; dashes="$*"; IFS=' '; spaces="$*"; IFS=; empty="$*"
printf %s\\n "$dashes" "$spaces" "$empty"

... который печатает:

Aaa-Zzz-Eee-Rrr-Foo-Bar
Aaa Zzz Eee Rrr Foo Bar
AaaZzzEeeRrrFooBar

Это более сложная тема, но она может быть использована для большого эффекта в этих областях. Важно защитить целостность данных, хотя - используйте set -f при разделении в оболочке, чтобы избежать создания имени файла на [? * и расширения цитат, которые вы не намерены разделять.

Приведенная выше команда dd , как следует отметить, скорее всего, будет очень эффективной только в языковом стандарте ASCII. В других случаях, вероятно, следует искать перекодировать или iconv или подобное.

2
27.01.2020, 23:15

Теги

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