Дайте шанс изумруду, у него лучшие механизмы настройки, которые позволят вам иметь множество тем и редактировать их с легкостью.
Для установки:
sudo apt-get install emerald
] И активировать:
emerald --replace
Вы также можете установить значок fusion, который позволит вам управлять вашими оконными менеджерами и украшениями щелчком.
Чтобы установить: [!d4 ]
sudo apt-get install fusion-icon
И активировать:
fusion-icon
Или найти его в меню в разделе «Системные инструменты».
BTW: есть темы, которые делают оформление окон как Windows, все версии.
Регулярное выражение GNU sed, которое должно работать для этого случая, это
sed -r 's/"([0-9]+)"/\1/g'
Для чистого sed вам нужно избежать скобок группировки и модификатора +
sed 's/"\([0-9]\+\)"/\1/g'
Вы может выполнять замещение на месте с некоторыми версиями sed eg
sed -ri 's/"([0-9]+)"/\1/g' file.csv
Вы также можете использовать класс POSIX [[:digit:]] вместо диапазона символов [0-9]
Ваше описание проблемы не очень специфично. Я предполагаю, что вы хотите удалить двойные кавычки только для 1-го и 3-го полей. Если это так, любой из них должен работать:
sedsed -r 's/^"([^"]+)"(\s*,\s*[^,]+)\s*,\s*"([^"]+)"/\1\2, \3/' file.csv
Объяснение -r позволяет использовать расширенные регулярные выражения, позволяя нам использовать круглые скобки для захвата шаблонов, не требуя их устранения. Итак, мы сопоставляем цитату в начале строки (^"), за которой следует один или несколько символов без кавычек ([^"]+), затем закрывающая цитата, за которой следует 0 или более пробелов, запятая, затем 0 или больше пробелов (\s*,\s*), затем участок не запятых до следующей запятой (это определяет второе поле). Наконец, мы ищем 0 или более пробелов, запятую и заменяем это на 1-й захваченный шаблон (\1), затем 2-й (\2), запятую, пробел и третью. Perl perl -pe 's/^"([^"]+)"(\s*,\s*[^,]+)\s*,\s*"([^"]+)"/$1$2, $3/; ' file.csv
Объяснение -p означает печать каждой строки после применения скрипта, переданного в -e. Сам скрипт является в основном тем же самым регулярным выражением, что и в sed выше. Только здесь захваченные паттерны $1. awk awk -F, -v OFS="," '{gsub("\"","",$1)0gsub("\"","",$3);}1;' file.csv
Объяснение -F устанавливает разделитель полей в ,. OFS - разделитель выходного поля, который также установлен на ,, чтобы линии печатались правильно. [F20] делает замену, заменяя все " ничем, поскольку мы запускаем ее на 1-м ($1) и 3-м полях ($3), она удаляет только кавычки из этих полей. [F24] - это всего лишь awk стенограмма «print the line». Маленький сценарий ниже содержит аргумент командной строки файла, выполняет итерацию по каждой строке в этом файле и разбивает каждую строку на список элементов, используя , в качестве разделителя. Каждая запись затем не сортируется и проверяется на то, что она является числовой строкой;
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fp:
for line in fp:
new_vals = []
vals = line.strip().split(',')
for val in vals:
val = val.strip().rstrip().replace('"','')
if not val.isdigit():
val = '"' + val + '"'
new_vals.append(val)
print(",".join(new_vals))
Тестирование:
$ cat input.txt
"34432", "name", "0", "very long description"
"1234", "othe name" , "42", "another description"
$ ./unquote_integers.py input.txt
34432,"name",0,"very long description"
1234,"othe name",42,"another description"
Дополнительные примечания:
В комментариях было задано следующее: , почему сценарий удаляет двойные кавычки вокруг каждого элемента, прежде чем оценивать, является ли элемент числовой строкой или нет. Основная причина этого заключается в том, что включение двойных кавычек сделает такой элемент, как "123", оценкой False, то есть не числовым. Фактически, нам нужно как-то оценить, что находится внутри двойных кавычек. Теперь есть альтернативный способ приблизиться к этому, используя кусочек списка каждого значения. Однако это не лучше, чем использование .replace() с самого начала. Это делает код короче, но по крайней мере в этом случае краткость скрипта не имеет значения - наша цель - заставить код работать, а не код-гольф.
Вот альтернативное решение со списками: [ ! d6]
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fp:
for line in fp:
new_vals = []
vals = line.strip().split(',')
for val in vals:
val = val.strip().rstrip() #remove extra spaces
val = val.replace('"','') if val[1:-1].isdigit() else val
new_vals.append(val)
print(",".join(new_vals))