2016-03-10 4 views
0

Я хочу удалить строку, которая соответствует указанному шаблону внутри тестового файла. Я хочу использовать команду sed/'lines для соответствия'/d внутри сценария оболочки linux. Это код:Команда Sed для удаления строки

#Define input parameters 
SCRIPT_NAME=$(basename $0) 
PATHFILE=$1 
NAMEFILE1=$2 
NAMEFILE2=$3 
HEADEREXPRESSION=$4 
#Define input file 
INPUTFILE1=$PATHFILE$NAMEFILE1 
INPUTFILE2=$PATHFILE$NAMEFILE2 
TEMPFILE=${INPUTFILE2}_TMP 
touch $TEMPFILE 
echo $INPUTFILE2 
echo $HEADEREXPRESSION 
echo $TEMPFILE 
#Remove header line from the second document 
sed '/${HEADEREXPRESSION}/d' $INPUTFILE2 >> $TEMPFILE 
#rm -f $INPUTFILE2 
#echo $TEMPFILE >> $INPUTFILE1 

В этом коде я хочу, чтобы удалить из первой строки в тестовый файл, который соответствует с выражением внутренней переменной HEADEREXPRESSION. Затем в результате будет помещена переменная tmp.
Это текстовый файл:

$ SYSDATE $ | PARENT_ELID | PARENT_ID_NUMBER | PARENT_REV | PARENT_LASTUPDATE_DATE | CHILD_ELID | CHILD_ID_NUMBER | CHILD_REV | CHILD_STATE | CHILD_LASTUPDATE_DATE | TSITEM | QUANTITY_DMS | OPTION_NAME |
2016/03/09 05: 00: 11 | AQJ2DJTH | 185273-13 | NC | 2016/03/09 01: 56: 14 | AQJ2DJTL | 185273-14 | NC | RELEASED | 2016/03/09 01:49 : 58 | 1 | 1 ||
2016/03/09 05: 00: 11 | AQJ2DJTL | 185273-14 | NC | 2016/03/09 01: 49: 58 | AZEUQ03Z0047AR | 185273-15 | A | RELEASED | 2003/01/15 09:46 : 18 | 1 | 1 ||
2016/03/09 05: 00: 11 | C3PK881C6A5JK0 | 201200-142 | M | 2016/03/09 03: 20: 26 | C3PK881BU135M0 | 201200-142EX | NC | RELEASED | 2016/03/09 03:21 : 26 | 1 | 1 ||
2016/03/09 05: 00: 11 | C3PK881C6A5JK0 | 201200-142 | M | 2016/03/09 03: 20: 26 | C3PK881BU2HVF0 | 201200-142RL | NC | RELEASED | 2014/07/23 09:35 : 14 | 1 | 1 | 1 |
2016/03/09 05: 00: 11 | BU9WPBTYLTYC60 | 3112535-02 | NC | 2016/03/09 04: 58: 35 | BU9WPBTYMATB60 | 3112865-02 | NC | CREATE | 2016/02/26 02:40 : 14 | 101 | 1 ||
2016/03/09 05: 00: 11 | BU9WPBTYLTYC60 | 3112535-02 | NC | 2016/03/09 04: 58: 35 | DN09DMYM1ROY70 | 3112892 | NC | RELEASED | 2011/05/13 21:09:16 | 102 | 1 ||
2016/03/09 05: 00: 11 | BU9WPBTYLTYC60 | 3112535-02 | NC | 2016/03/09 04: 58: 35 | DN09DMYM2CRJP0 | 3112897 | D2 | RELEASED | 2011/07/24 13:41:16 | 103 | 1 ||
2016/03/09 05: 00: 11 | BU9WPBTYLTYC60 | 3112535-02 | NC | 2016/03/09 04: 58: 35 | DN09DMYL210V60 | 1900169-1205 | NC | RELEASED | 2011/06/02 08:14 : 33 | 104 | 2 ||

Я хочу, чтобы удалить первую строку, используя выражение картины, как:

$SYSDATE$|PARENT_ELID|PARENT_ID_NUMBER|PARENT_REV|PARENT_LASTUPDATE_DATE|CHILD_ELID|CHILD_ID_NUMBER|CHILD_REV|CHILD_STATE|CHILD_LASTUPDATE_DATE|TSITEM|QUANTITY_DMS|OPTION_NAME| 

Я призываю этот сценарий с помощью этой командной строки:

./delete_headeer.sh /wmextdata/scripts/DEV/primavera/SS_IPP_SOSLOAD/ SSP6_LINKS.TXT-20160309-000341 SSP6_LINKS.TXT-20160309_121000 "\$SYSDATE$|PARENT_ELID|PARENT_ID_NUMBER|PARENT_REV|PARENT_LASTUPDATE_DATE|CHILD_ELID|CHILD_ID_NUMBER|CHILD_REV|CHILD_STATE|CHILD_LASTUPDATE_DATE|TSITEM|QUANTITY_DMS|OPTION_NAME|" 

Однако первые строки, которые соответствуют с шаблон не будет удаляться в выходном файле. Как я могу исправить проблему?

+0

переформатирования кода для лучшей читаемости – maxhb

ответ

1

Вы можете использовать следующую команду, чтобы патч в удалить шаблон из файла

sed -i.bak "/$pattern/d" $FILE_NAME 
+1

Это правильно. Внутри одинарных кавычек оболочка не расширяет значение переменной (поэтому 'sed '/ $ {HEADEREXPRESSION}/d' ...' будет удалять только строку, содержащую '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' '), но использование двойных кавычек позволяет (требует) оболочки расширять' $ {HEADEREXPRESSION} ', что означает, что правая строка, вероятно, будет удалена. –

Смежные вопросы