sed заменяют все вкладки и пробелы с одиночным пробелом

Это вероятно, потому что Ваш веб-сервер не работает как корень и поэтому не имеет доступа к файлу в /root/. Выполненный ps на хосте и grep для серверного процесса называют для наблюдения имени пользователя. Это может быть что-то как nobody. Если это так, я предложил бы генерировать ключ специально для использования веб-сервером и затем chownлуг это пользователю сервер работает как. Надо надеяться, это решит Вашу проблему :)

23
задан 23 September 2012 в 21:17
4 ответа

Используйте sed -e "s / [[: space:]] \ + / / g"

Вот объяснение:

[   # start of character class

  [:space:]  # The POSIX character class for whitespace characters. It's
             # functionally identical to [ \t\r\n\v\f] which matches a space,
             # tab, carriage return, newline, vertical tab, or form feed. See
             # https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

]   # end of character class

\+  # one or more of the previous item (anything matched in the brackets).

Для замены вам нужно только чтобы вставить пробел. [: space:] там не будет работать, так как это аббревиатура для класса символов, и механизм регулярных выражений не знает, какой символ туда поместить.

+ должен быть экранированным в регулярном выражении, потому что с механизмом регулярных выражений sed + является нормальным символом, тогда как \ + является метасимволом для 'одного или нескольких'. На странице 86 Mastering Regular Expressions Джеффри Фридл упоминает в сноске, что ed и grep использовали экранированные круглые скобки, потому что «Кен Томпсон считал, что регулярные выражения будут использоваться в основном для работы с C код, где необходимость сопоставления необработанных круглых скобок была бы более распространена, чем обратная ссылка ". Я предполагаю, что он чувствовал то же самое относительно знака плюс, следовательно, ему нужно было избежать его, чтобы использовать его в качестве метасимвола. Это легко запутать .

В sed вам нужно экранировать + , ? , | , ( и ) . Или используйте -r для использования расширенного регулярного выражения (тогда это выглядит как sed -r -e "s / [[: space:]] \ + / / g" или sed -re "s / [[: space:]] \ + / / g"

40
ответ дан 28 November 2019 в 20:19

Мне нравится использовать следующий псевдоним для bash. Основываясь на том, что написали другие, используйте sed для поиска и замены нескольких пробелов одним пробелом. Это помогает получить стабильные результаты от резки. В конце я пропускаю его через sed еще раз, чтобы поменять место на вкладку, чтобы ее было легче читать.

alias ll='ls -lh | sed "s/ \+/ /g" | cut -f5,9 -d" " | sed "s/ /\t/g"'
-2
ответ дан 28 November 2019 в 20:19

can nwere ike iji -s ("pịpịa") nhọrọ nke tr :

$ tr -s '[:blank:]' <<< 'test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

The [: blank:] agwa agwa gụnyere ma oghere na taabụ.

6
ответ дан 28 November 2019 в 20:19

Вот несколько интересных методов, которые я нашел в ходе экспериментов (используя xxd для просмотра вкладок) .

echo -e \\033c
s=$(echo -e "a\t\tb\t\tc\t\td\t\te\tf")

echo 'original string with tabs:'
echo "$s"
echo "$s" | xxd

echo -e '\nusing: \techo "$s" | tr -s \\\\t " "'
echo "$s" | tr -s \\t " "
echo "$s" | tr -s \\t " " | xxd

echo -e '\nusing: \techo "$s" | sed '"'s/\\\\t/ /g'"
echo "$s" | sed 's/\t\+/ /g'
echo "$s" | sed 's/\t\+/ /g' | xxd

echo -e '\nusing: \techo ${s/ / }'
echo ${s/ / }
echo ${s/ / } | xxd

z=$(echo $s)
echo -e '\nusing: \tz=$(echo $s); echo "$z"'
echo "$z"
echo "$z" | xxd

echo -e '\nusing: \tread s < file.in; echo $s'
read s < file.in
echo $s
echo $s | xxd

echo -e '\nusing: \twhile read s; do echo $s; done'
while read s;
do
  echo $s
done < file.in
0
ответ дан 23 July 2020 в 14:51

Теги

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