Если эта строка является частью файла или вывода:
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
$ cat file
aaa-zzz-eee-rrr
foo-bar
$ perl -ne 'print join " ", map { ucfirst } split /-/' file
Aaa Zzz Eee Rrr
Foo Bar
while IFS='-' read -r -a words; do
printf '%s\n' "${words[@]^}" | paste -sd ' '
done < file
выхода:
Aaa Zzz Eee Rrr
Foo Bar
Начните с изменения тире в пробелы, как:
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
$
в 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
Шаг 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
В качестве дополнения к ответу Роланда Иллига можно написать программу, которая, получив разрешения 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
или подобное.