Как я могу добавить пробелы в конце конкретных строк с помощью регулярных выражений - PullRequest
0 голосов
/ 14 января 2019

У меня есть текстовый файл, который имеет строки разной длины. Мне нужно сделать их унифицированными, чтобы функция импорта текста PLSQL Developers правильно их читала. Строки длиной 89 символов должны быть дополнены 4 пробелами в конце. По какой-то причине аргумент -i для sed также не принят.

Файл можно найти здесь

Я пробовал несколько различных команд регулярных выражений, найденных из различных источников через Google, но ни одна из них не работает, либо потому, что «функция не может быть проанализирована», либо она не добавляет необходимые пробелы.

Код, который я написал и работал с Notepad ++, был
Найти: (^. {89}) ($)
Заменить: \ 1 \ 2

Я пробовал несколько команд Unix Sed, таких как
sed -e "s/(^.{89})($)/\1 \2/" file.txt
sed -e "s/(^.{89})($)/\1\s\s\s\s\2/" file.txt
sed -e "s/(^.{89})($)/\1\ \ \ \ \2/" file.txt
sed -e "s/\(^.\{89\}\)\($\)/\1\ \ \ \ \2" file.txt
sed -e 's/\(^.\{89\}\)\($\)/\1[[:space:]]\2/g' file.txt
sed -e 's/\(^.\{89\}\)\($\)/\1[[:space:]]\{4\}\2/g' file.txt
sed -e 's/(^.{89})($)/\1[[:space:]]{4}\2/g' file.txt

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Попробуйте это:

awk '{ <br>
 diff = 89 - length($0); <br>
 for(i=1;i<=diff; i++) <br>
 { <br>
   $0 = $0  "a" <br>
 } <br>
 print $0 <br>
} <br>
' FileName.txt
0 голосов
/ 16 января 2019

Программный инструмент Kludge для HP-UX, основанный на его руководствах :

sed 's/.*/    /' file | paste -d ' ' file - | cut -c 1-93 

Как это работает:

  1. Используйте sed, чтобы создать фиктивный поток с тем же числом строк, что и file , но с четырьмя пробелами в каждой строке.
  2. Используйте paste, чтобы добавить фиктивный поток к тому, что находится в файле . (Из-за -d ' ' он добавляет пять пробелов, но это не имеет большого значения.)
  3. Используйте cut, чтобы отрубить что-нибудь более 93 байтов.

Если HP-UX sed даже меньше, чем GNU sed, чем я предполагал, его можно заменить на некоторый эквивалент, например:

yes '    ' | head -n $(wc -l < file) | paste -d ' ' file - | cut -c 1-93 
0 голосов
/ 14 января 2019

Основная проблема здесь заключается в том, что вы используете синтаксис BRE POSIX, а неэкранированный ( / ) рассматривается как буквенные скобки, а неэкранированный { / } - как буквальные скобки.

Это должно работать:

sed 's/^.\{89\}$/&    /' file.txt > newfile.txt

Здесь:

  • ^ - соответствует началу строки
  • .\{89\} - соответствует любым 89 символам
  • $ - устанавливает окончание позиции строки.

& в замене относится ко всему совпадению.

Если вам нужно использовать опцию -i, см. Файл редактирования sed вместо .

...