Удалить строку длиной ровно n символов

Он делает то, что написано на банке.

Вспомните документацию :

Когда Bash вызывается как интерактивная оболочка входа или как неинтерактивная оболочка с параметром - login , он сначала читает и выполняет команды из файла / etc / profile

. Он правильно объясняет, что он читает и выполняет / etc / profile как интерактивную оболочку входа в систему или как неинтерактивная оболочка с опцией - логин .Это не означает, что это не интерактивная оболочка входа в систему, обозначенная $ 0 , начинающаяся с дефиса.

Однако такое поведение является намеренным, и его можно изменить во время компиляции, раскомментировав параметр времени компиляции, найденный в config-top.h :

/* Define this to make non-interactive shells begun with argv[0][0] == '-'
run the startup files when not in posix mode. */
/* #define NON_INTERACTIVE_LOGIN_SHELLS */

Это действительно вызывает вопрос однако, почему это поведение было реализовано, когда это не так, IMHO , как можно было бы разумно ожидать, что оно будет работать, особенно когда оно не реализовано таким образом в других оболочках.

Тем не менее, я не думаю, что стандартная оболочка POSIX определяет оболочку входа в систему , поэтому я предполагаю, что она открыта для интерпретации.

Вот способ решения исходной проблемы, который работает с bash :

$ su - someuser -c 'bash -l -c tmux'

1
25.08.2017, 11:34
5 ответов

С расширенными регулярными выражениями GNU sed :

for file in ./*.txt; do
    sed -i -r '/^.{9}$/d' "${file}"
done

(Используйте -E вместо -r во FreeBSD / macOS ( -E также будет работать в последних версиях GNU sed ) и -i '' вместо -i )

Как указано в don_crissti , с GNU sed цикл не нужен:

sed -s -i -r '/^.{9}$/d' ./*.txt
5
27.01.2020, 23:11

С awk :

for f in ./*.txt; do
    awk 'length($0) != 9' "$f" >"destdir/$f"
done

С sed :

for f in ./*.txt; do
    sed '/^.\{9\}$/d' "$f" >"destdir/$f"
done

С помощью grep :

for f in ./*.txt; do
    egrep -vx '.{9}' "$f" >"destdir/$f"
done
4
27.01.2020, 23:11

Это может сработать:

grep -vE '^.{9}$' filename > new_filename

Переключите 9 на любые необходимые символы.

       -v, --invert-match
          Invert the sense of matching, to select non-matching lines.
       -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).

. означает любой символ, {9} означает соответствие этому шаблону 9 раз. ^ означает начало строки, а $ означает конец линия.

1
27.01.2020, 23:11
awk length!=9 < in > out
1
27.01.2020, 23:11
for i in *.txt
do
  egrep -v '^.........$' <"$i" >destdir/"$i"
done

Или, если вы настаиваете на использовании sed, а не egrep:

for i in *.txt
do
  sed '^.........$/d' <"$i" >destdir/"$i"
done

Удалить строки длиной 235 символов:

X=""
for i in `seq 1 235`
do
  X="$X."
done

for i in *.txt
do
  egrep -v '^'"$X"'$' <"$i" >destdir/"$i"
done

Простота сама!

0
27.01.2020, 23:11

Теги

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