Я не совсем понимаю, о чем именно вы просите. Я привожу три примера, чтобы показать, что вы правы:
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/bambi.txt' -print
Ищет все "bambi.txt" в определенных подпапках,пропуская другие определенные подпапки... необходимо ()
, чтобы выразить :"обрезать (пропустить ), если это папка и имя либо.aaa, либо содержит rc".
Затем скобки должны быть защищены от интерпретации оболочкой с помощью одинарных кавычек или обратной косой черты. В большинстве случаев -o
для OR
и -a
по умолчанию для AND
достаточно, поэтому GNU/Linux живет с этим.
Для этого можно использовать 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
Это то, что вы пытаетесь сделать -заменить строку пробелами?
$ 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 для всех символов в строке, кроме новой строки.