sed - строки изменения, которые запускаются с одного пообещанного и конца с другим?

Вы видите различие с declare -p:

unset foo
declare -a foo
declare -p foo
# prints declare -a foo='()'
foo=
declare -p foo
# prints declare -a foo='([0]="")'

Если Вы хотите инициализировать пустой массив, вывод первого declare -p хорошая подсказка на лучшем способе объявить это:

declare -a array='()'

( declare -a часть является, вероятно, дополнительной, простое array=() должен работать точно также.)

Если Вы хотите протестировать, если массив имеет 0 элементов, используйте числовое сравнение на ${#array[@]}; не пытайтесь сделать a test -z на расширении, как не даст корректный результат во многих случаях.

0
24.10.2013, 15:56
3 ответа

Вот другой подход:

sed -e '/^[[:space:]]*bucket.*endy$/s/bucket/(bucket/' file.txt

Начальная буква /pattern/ говорит sed только работать над строками, содержащими это pattern, и остальная часть его является простой, стандартной заменой.

3
28.01.2020, 02:13

Можно использовать обратные ссылки (например, \1) в Вашем заменяющем термине, который заменит подвыражения (вещи, включенные в завершенных круглых скобках — \(…\)) в Вашем критерии поиска. Например,

$ cat test001.txt | sed -e 's/^\([[:space:]]*\)\(bucket.*endy\)$/\1(\2/'
this
is a
 test bucket
bucket line not this one.
  (bucket lein endy
    (bucket and others endy
and
a ttest

создаст два подвыражения:

  1. ведущие пробелы: ^\([[:space:]]*\)
  2. строка, которая запускается с "блока" и заканчивается "endy" (в EOL): \(bucket.*endy\)$

Это затем заменит любую строку, которая соответствует \1(\2, который является пробелом, сопровождаемым вводной круглой скобкой, сопровождаемой блоком.. строка endy.

4
28.01.2020, 02:13

\s не часть BRE, который sed использование. В BRE \s совпадает с литералом s. Эквивалент \s был бы [[:space:]]. Попробуйте следующее:

sed -i 's/^[[:space:]]*bucket/(bucket/g' test001.txt
1
28.01.2020, 02:13

Теги

Похожие вопросы