Я работаю над скриптом для извлечения данных в текстовый файл (fossa_results.txt) с помощью команды curl, и извлеченный ответ будет следующим:
"license_count": 32,
"dependency_count": 295,
"todo_count": 9,
"unresolved_issue_count": 6,
"unresolved_licensing_issue_count": 2,
"unresolved_security_issue_count": 4,
"unresolved_quality_issue_count": 0,
приведенный выше ответ записывается в текстовый файл (fossa_results.txt), и я пытаюсь выполнить операцию замены строки в этом файле с помощью команды sed и шаблона регулярного выражения, и ожидаемый результат такой, как показано ниже, и записать обратно в тот же файл (fossa_results.txt)
License Count= 32
Dependency Count= 295
Todo Count= 9
Unresolved Issue Count= 6
Unresolved Licensing Issue Count= 2
Unresolved Security Issue Count= 4
Unresolved Quality Issue Count= 0
Ниже приведен сценарий, который я использовал для этого.
sed -i 's/^[[:space:]]*//' fossa_results.txt -- trying to remove leading spaces
sed -i 's/[[:space:]]*$//' fossa_results.txt -- trying to remove trailing spaces
sed -i 's/"\""/""/g' fossa_results.txt -- trying to replace "
sed -i 's/"\"\\[.*?\\]: "/""/g' fossa_results.txt - trying to remove any unwanted string that comes within [] like date.
sed -i 's/"\"\\[.*?\\]"/""/g' "fossa_results.txt"
sed -i 's/"\"license_count:"/"License Count = "/g' "fossa_results.txt"
sed -i 's/"\"todo_count:"/"Todo Count = "/g' "fossa_results.txt"
sed -i 's/"\" dependency_count:"/"Dependancy Count = "/g' "fossa_results.txt"
sed -i 's/"\" unresolved_issue_count:"/"Unresolved Issue Count = "/g' "fossa_results.txt"
sed -i 's/"\" unresolved_licensing_issue_count:"/"Unresolved Licensing Issue Count = "/g' "fossa_results.txt"
sed -i 's/"\" unresolved_security_issue_count:"/"Unresolved Security Issue Count = "/g' "fossa_results.txt"
sed -i 's/"\" unresolved_quality_issue_count:"/"Unresolved Quality Issue Count = "/g' "fossa_results.txt"
fossaresults = "$(cat fossa_results.txt)"
но когда я печатаю fossa_results.txt с помощью команды cat, он печатает исходные данные, и кажется, что замена не работает.
Многократное выполнение sed -i
для одного и того же файла является антипаттерном. Вы хотите заменить curl >file; sed -i xxx file; sed -i yyy file
просто curl | sed -e xxx -e yyy >file
Если ввод на самом деле JSON, используйте инструмент JSON, например jq
, для его обработки.
Вопросы, которые требуют «пожалуйста, помогите мне», как правило, требуют строго локализованного руководства или, в некоторых случаях, постоянной или частной помощи, что не подходит для нашего формата вопросов и ответов. Он также довольно расплывчатый, и его лучше заменить более конкретным вопросом. Пожалуйста, прочитайте Почему "Кто-нибудь может мне помочь?" не актуальный вопрос?.
Этот ответ не по теме, потому что он предлагает решение awk вместо sed или bash с пометкой (но все же может помочь).
Вы можете использовать awk для правильного форматирования содержимого файла.
"license_count": 32,
"dependency_count": 295,
"todo_count": 9,
"unresolved_issue_count": 6,
"unresolved_licensing_issue_count": 2,
"unresolved_security_issue_count": 4,
"unresolved_quality_issue_count": 0,
BEGIN {
FS = ":"
}
{
gsub("\"","",$1)
gsub(" ","",$1)
gsub(",","",$2)
print $1" = "$2
}
awk -f a.awk d.txt
license_count= 32
dependency_count= 295
todo_count= 9
unresolved_issue_count= 6
unresolved_licensing_issue_count= 2
unresolved_security_issue_count= 4
unresolved_quality_issue_count= 0
Альтернатива awk
:
awk '{ gsub(":"," = "); gsub(/^ *|\"|,/,""); gsub("_"," "); for (i=1; i<=NF; ++i) { $i=toupper(substr($i,1,1)) tolower(substr($i,2)); }}1' src.dat
License Count= 32
Dependency Count= 295
Todo Count= 9
Unresolved Issue Count= 6
Unresolved Licensing Issue Count= 2
Unresolved Security Issue Count= 4
Unresolved Quality Issue Count= 0
заменить все двоеточия знаком равенства gsub(":"," = ");
замените начальные пробелы, двойные кавычки или запятые пустой строкой gsub(/^ *|\"|,/,"");
заменить подчеркивание одиночным пробелом gsub("_"," ");
сделать заглавной первую букву каждого поля for (i=1; i<=NF; ++i) { $i=toupper(substr($i,1,1)) tolower(substr($i,2)); }}1'
Содержимое входного файла src.dat:
"license_count": 32,
"dependency_count": 295,
"todo_count": 9,
"unresolved_issue_count": 6,
"unresolved_licensing_issue_count": 2,
"unresolved_security_issue_count": 4,
"unresolved_quality_issue_count": 0,
Использование GNU sed
$ sed -Ei.bak ':a;s/ +?([^:]*)_/\1 /;ta;s/:/=/;s/[",]//g;s/[a-z]+/\u&/g' input_file
License Count= 32
Dependency Count= 295
Todo Count= 9
Unresolved Issue Count= 6
Unresolved Licensing Issue Count= 2
Unresolved Security Issue Count= 4
Unresolved Quality Issue Count= 0
Предполагая, что в вашем текстовом файле нет cr, что-то вроде:
sed 's/^[[:blank:]]*//;s/[",]*//g;s/_/ /g;s/\w\+/\L\u&/g;s/:/=/' fossa_results.txt