У меня есть CSV-файл (скажем, temp.csv) со строками и числами. Мне нужно удалить строки, которые содержат определенный шаблон строки в начале строк в файле. Например, вот мой файл -
req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
Я пишу шаблон для req_file_curr
команды
~ $ req_file_curr=req1
echo "${req_file_curr}"
дает вывод какreq1
Однако при использовании его вsed
команда, как показано ниже:
sed '/\"${req_file_curr}\"/d' temp.csv
дает вывод как
req1,incl_patt1,excl_patt1,2,ind1
req1,incl_patt2,excl_patt2,1,ind1
req1,incl_patt3,excl_patt3,4,ind1
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
Я ожидаю, что результат будет таким
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
Как я могу использовать переменную из оболочки в качестве шаблона для поиска вsed
илиawk
?
решение1
Вам необходимо заключить sed
шаблон в двойные кавычки, чтобы оболочка могла раскрыть переменную перед ее передачей sed
:
sed "/^${req_file}/d" temp.csv
Вам также необходимо использовать ^
якорь, чтобы указать sed
, что этот шаблон должен располагаться в начале строки.
решение2
Здесь нет необходимости в awk
или sed
:
grep -v "^$req_file_curr," file
Обратите внимание, что (как и для sed
или , awk
хотя и в меньшей степени) это предполагает, что $req_file_curr
не содержит операторов регулярных выражений (например .
, , *
...).
Если это так, вам придется экранировать эти символы или с помощью awk
, вы можете использовать подход, использующий его index()
функцию:
S="$req_file_curr," awk 'index($0, ENVIRON["S"]) != 1' < file
решение3
Вы установили req_file_curr
, но используете req_file
. И ваша sed
команда не будет работать, так как переменная оболочки не может быть расширена в вашей sed
команде.
Вы можете попробовать это:
$ sed '/'"${req_file_curr}"'/d' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
или sed
с использованием двойных кавычек:
sed "/${req_file_curr}/d" file
и используя awk
:
$ awk -v req=$req_file_curr '$0 !~ req' file
req2,inc_patt1,exc_patt1,1,ind2
req2,inc_patt2,exc_patt2,2,ind2
req2,inc_patt3,exc_patt3,3,ind2
req3,pattern3,expatt3,1,ind3
req4,pattern4,expatt4,1,ind4
решение4
Решением для ED было бы что-то вроде этого.
req_file_curr=req1
printf '%s\n' "g/^$req_file_curr/d" w | ed -s temp.csv
Он редактирует файл на месте, поэтому сначала протестируйте, прежде чем запускать его в своих файлах.