В sed
:
sed '/D$/{N;/R$/s/\n-from/\n-this/}' your_file
Расширенный с комментариями:
sed ' /D$/{ # If the current line ends in D
N; # Append the next line to the pattern space
/R$/s/\n-from/\n-this/ # If you find R at end-of-line, substitute
}' your_file
Вам нужно заключить шаблон sed
в двойные кавычки, чтобы оболочка могла расширить переменную перед передачей ее в sed
:
sed "/^${req_file}/d" temp.csv
Вам также нужно использовать ^
якорь, чтобы указать sed
, что этот шаблон должен встречаться в начале строки.
Нет необходимости в 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
Вы установили req_file_curr
, но используете req_file
. И ваша команда sed
не будет работать, так как переменная shell не может быть развернута в вашей команде 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
Эд-решение будет выглядеть примерно так.
req_file_curr=req1
printf '%s\n' "g/^$req_file_curr/d" w | ed -s temp.csv
Он редактирует файл на месте, поэтому сначала проверьте, прежде чем запускать это с вашими файлами.