Я хочу удалить специальные символы и поставить такое же количество пробелов между

Я не совсем понимаю, о чем именно вы просите. Я привожу три примера, чтобы показать, что вы правы:

 Pipelines
       A pipeline is a sequence of one or more commands separated by 
       one of thwe control operators | or |&. The format for a pipeline is:
       [time [-p]] [ ! ] command [ [|||&] command2... ]

(из руководства Bash; введите man bashв вашей оболочке)

В bash.pdf от GNU, содержащем некоторые незначительные изменения:

The format for a pipeline is
[time [-p]] [!]command1[ | or |&command2]...

И в спецификации posix:

The format for a pipeline is:
    [!] command1 [ | command2...]

Оболочка сама по себе использует так много специальных символов, что согласованный метасинтаксис нецелесообразен. Но все они используют одних и тех же обычных подозреваемых.

«Оболочка» — это не «командная строка», а GNU/Linux — это не MS, так что различия складываются. Вероятно, сначала вам понадобится некоторая базовая информация о использовании оболочки Linux и о Unix в целом -, наверняка в Интернете есть информация именно для вашей ситуации. GNU/Linux не несет ответственности за объяснение основ или отличий от Windows.

Другой пример, с командой/утилитой find

man findдает это в оболочке GNU/Linux bash:

  find  [-H]  [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [ex-
   pression]

Когда вы вводите /EXPRв пейджер (или просто читаете и прокручиваете ), вы попадаете на

EXPRESSION
       The  part  of the command line after the list of starting points is the
       expression.  This is a kind of query specification...[cut]

, который приведет вас к:

 OPERATORS
       Listed in order of decreasing precedence:

       ( expr )
              Force  precedence.   Since parentheses are special to the shell,
              you will normally need to quote them.  Many of the  examples  in
              this manual page use backslashes for this purpose: `\(...\)' in-
              stead of `(...)'.

И все это может привести к сложному маленькому «своего рода запросу», например:

find -L /students/projects/myname \
    -type d '(' -name '.aaa' -o -name '*rc*' ')' -prune -o \
    -path '*/*/class_project/*/*/pikachu/*/*/bambi/b‌​ambi.txt' -print

Ищет все "bambi.txt" в определенных подпапках,пропуская другие определенные подпапки... необходимо (), чтобы выразить :"обрезать (пропустить ), если это папка и имя либо.aaa, либо содержит rc".

Затем скобки должны быть защищены от интерпретации оболочкой с помощью одинарных кавычек или обратной косой черты. В большинстве случаев -oдля ORи -aпо умолчанию для ANDдостаточно, поэтому GNU/Linux живет с этим.

-1
20.11.2020, 13:34
2 ответа

Для этого можно использовать sed. Это немного сложно, потому что у вас есть 'в вашем шаблоне. Это означает, что вам нужно использовать "для sed. Кроме того, у вас есть $, который нужно будет экранировать, чтобы sedне воспринимал его как «конец строки», а также, поскольку мы будем использовать двойные кавычки, чтобы оболочка не увидела это как переменная. Наконец, поскольку у вас также есть /, нам нужно будет использовать другой символ в операторе замены. Имея все это в виду, это должно делать то, что вы хотите:

$ sed "s:fBQ=\$L+tG=#x4kDh('t%BWBG/P|U9M:                              :" file
L$+M)jX];&?+jip=ZjJ#}^yV5;                              `,pcII*6G<r 

Для более общего решения, когда вы можете передать любую строку в переменной и заменить ее, вы можете попробовать что-то вроде этого:

$ export var="fBQ=\$L+tG=#x4kDh('t%BWBG/P|U9M"
$ perl -pe '$f=quotemeta($ENV{var}); s/$f/" " x length($f)/e' file
L$+M)jX];&?+jip=ZjJ#}^yV5;                                        `,pcII*6G<r 
0
18.03.2021, 22:48

Это то, что вы пытаетесь сделать -заменить строку пробелами?

$ cat str
fBQ=$L+tG=#x4kDh('t%BWBG/P|U9M

$ cat file
L$+M)jX];&?+jip=ZjJ#}^yV5;fBQ=$L+tG=#x4kDh('t%BWBG/P|U9M`,pcII*6G<r

$ awk 'NR==FNR{str=$0; lgth=length(str); next} s=index($0,str){$0=substr($0,1,s-1) sprintf("%*s",lgth,"") substr($0,s+lgth)} 1' str file
L$+M)jX];&?+jip=ZjJ#}^yV5;                              `,pcII*6G<r

Описанное выше будет работать с использованием любого awk в любой оболочке во всех полях UNIX для всех символов в строке, кроме новой строки.

0
18.03.2021, 22:48

Теги

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