Ошибка неправильной замены при передаче уменьшенной переменной в команду "sed" - PullRequest
0 голосов
/ 25 сентября 2018

Мне нравится использовать команду «sed» для удаления двух последовательных строк из файла.Я могу удалить одну строку, используя следующий синтаксис, где переменная «index» содержит номер строки:

sed -i "${index}d" "$PWD$DEBUG_DIR$DEBUG_MENU"

Так как мне нравится удалять последовательные строки, я протестировал этот синтаксис, который предположительно уменьшает / увеличивает переменную, но я получаюошибка плохой замены.

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

((index ++)), ни ((index--))

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

sed - это правильный инструмент для выполнения s / old / new, , то есть все .То, что вы пытаетесь сделать, это не так, почему вы пытаетесь заставить sed сделать что-то, когда есть гораздо более подходящие инструменты, которые могут сделать работу намного проще?

Правильный способ сделать то, что ваш сценарий:

#retrieve first matching line number
index=$(sed -n "/$choice/=" "$PWD$DEBUG_DIR$DEBUG_MENU")
#delete matching line plus next line from file 
sed -i "/$index[1], (( $index[1]++))/"
"$PWD$DEBUG_DIR$DEBUG_MENU"

, кажется, пытается это сделать:

awk -v choice="$choice" '$0~choice{skip=2} !(skip&&skip--)' "$PWD$DEBUG_DIR$DEBUG_MENU"

Например:

$ seq 20 | awk -v choice="4" '$0~choice{skip=2} !(skip&&skip--)'
1
2
3
6
7
8
9
10
11
12
13
16
17
18
19
20

, если вы хотите удалить только первое совпадение:

$ seq 20 | awk -v choice="4" '$0~choice{skip=2;cnt++} !(cnt==1 && skip && skip--)'
1
2
3
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

или 2-й:

$ seq 20 | awk -v choice="4" '$0~choice{skip=2;cnt++} !(cnt==2 && skip && skip--)'
1
2
3
4
5
6
7
8
9
10
11
12
13
16
17
18
19
20

и пропустить 5 строк вместо 2:

$ seq 20 | awk -v choice="4" '$0~choice{skip=5} !(skip&&skip--)'
1
2
3
9
10
11
12
13
19
20

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

0 голосов
/ 26 сентября 2018

Использование sed с «index» в удалении одной строки дважды подряд / последовательно / работает и решает несколько проблем.

#delete command line 

sed -i "$ {index} d" "$ PWD $ DEBUG_DIR$ DEBUG_MENU "

# удалить строку описания

sed -i "${index}d" "$PWD$DEBUG_DIR$DEBUG_MENU"
0 голосов
/ 25 сентября 2018

Если вам нужен только первый, закройте его, когда увидите:

sed -n "/$choice/ {=;q}" file

Но вы выглядите так, будто обрабатываете этот файл несколько раз.Должен быть более простой способ сделать это, если вы можете описать свою общую цель.

Например, если вы просто хотите удалить совпавшую строку и следующую строку, но только в первый раз, выможно использовать awk: здесь мы видим, что «4» и «5» пропали, но «14» и «15» остаются:

$ seq 20 | awk '/4/ && !seen {getline; seen++; next} 1'
1
2
3
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

С GNU sed вы можете использовать +1 каквторой адрес в диапазоне адресов:

index=4
seq 10 | sed "$index,+1 d"

Или, если вы хотите использовать bash / ksh арифметическое расширение : используйте оператор постинкрементного увеличения

seq 10 | sed "$((index++)),$index d"

Обратите внимание, что благодаря конвейеру sed работает в подоболочке: даже если значение индекса теперь равно 5, это происходит в подоболочке.После завершения команды sed индекс имеет значение 4 в текущей оболочке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...