Вы можете сделать:
sed 's/\(\.[^"[:blank:]]*\)[[:blank:]]*"/\1"/g'
То есть удалить последовательность пробелов, следующих за .
, за которым следует последовательность символов, не являющихся пробелами, или "
и за которыми следует "
Чтобы удалить пробелы перед каждым другимсимволом двойной кавычки в каждой строке вы можете сделать что-то вроде:
sed 's/[[:blank:]]*"/"&/g
s/\(\([^"]*"\)\{3\}\)[[:blank:]]*"/\1"/g
s/"\([^"]*"\)/\1/g'
То есть:
"
перед каждым <пробелы>"
"<пробелы>""<пробелы>"
до "<пробелы>"""
"
, чтобы отменить вставки in 1Или более простым способом с awk
:
awk -F \" -v OFS=\" '
{
for (i = 2; i <= NF; i += 2 )
sub(/[[:blank:]]*$/, "", $i)
print
}'
Обратите внимание, что tr
не будет сжимать символы, если вы не используете опцию -s
. Скорее всего, вы забыли указать расширение параметра или подстановку команды, содержащую вывод tr
.
В любом случае, tr
нельзя использовать для этой задачи. просто инструмент транслитерации.Все, что он может сделать, это перевести/удалить/сжать всесимволы пробела. Он не может переводить/удалять/сжимать только некоторыепробелы.
Из 4BSD ps man page:
Состояние задается последовательностью из четырех букв, например, ``RWNA''. Первая буква указывает на запускаемость процесса: R для запускаемых процессов, T для остановленные процессы, P для процессов, находящихся в ожидании страницы, D для процессов, находящихся в дисковом (или другом краткосрочном) ожидании, S для процессов, находящихся в состоянии сна менее 20 секунд, и I для простаивающих (спящих более 20 секунд) процессов.