Shell: Как заменить символ только внутри текста в двойных кавычках в файле?

apt-get install linux-headers-4.9.0-kali3-amd64

Последняя команда может завершиться ошибкой, если ваша система не полностью обновлена. Я использовал эту команду, и она была успешной:

apt-get install linux-headers-amd64
0
29.11.2019, 09:30
4 ответа

Вы можете использовать простую замену sedдля сопоставления строки, которая начинается с "и содержит ли не встроенный "внутри, и захватить эту группу до появления |и затем сопоставьте вторую группу оттуда с концом ". Просто распечатайте совпадающие группы, так как они не содержат символ |

.
sed 's/\("[^"]*\).* |\([^"]*"\)/\1\2/g'
2
28.01.2020, 02:14

У Ruby есть хорошая библиотека CSV, так что это может быть одна -строчка:

ruby -rcsv -e 'CSV.filter(col_sep: "|") {|row| row.each {|field| field.gsub!(/\| /, "")}}' file
0
28.01.2020, 02:14

Использование Perl (извините :запутанный код)

perl -pe 's/".*?"/ $& =~ tr[|][]dr /ge'     file

Пояснение:

  • perl -pe proc-применить procко всем строкам
  • s/RE/ f($&) /ge-заменяет REрезультатомf(matching string)
  • tr[|][]dr-переводит |ничем (=удаляет)
0
28.01.2020, 02:14

Используя csvformatиз CSVKit , сsed:

$ csvformat -d '|' file | sed 's/| //' | csvformat -D '|'
abc|45|Do not replace in this|0.23

Первый вызов csvformatизменяет разделитель CSV с |на запятую. Канал в тексте (и пробел после него )можно удалить простым вызовом sed. Затем мы снова вызываем csvformat, чтобы изменить разделители обратно на |.

Обратите внимание, что двойные кавычки не используются в окончательном выводе. Это потому, что они больше не нужны. Во-первых, они никогда не были частью фактических данных, а нужны были только для разграничения этого поля из-за используемого в нем конвейера (. Исходные данные были правильно цитируемым CSV-файлом ).

Вы хотите, чтобы поля в выводе заключались в кавычки,используйте -U1с последним вызовом csvformat. Это приведет к цитированию всех полей.

4
28.01.2020, 02:14

Теги

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