Использование переменной в строке

Внутри подстановки команд у вас есть "$FILE" | sed -e 's/\\/\//gp', которую оболочка расширяет до (, эквивалентной)'\\edi3\welshch\test' | sed -e 's/\\/\//gp'. Поскольку это команда , оболочка ищет файл с именем \\edi3\welshch\testдля запуска.

Вероятно, вы хотели использовать echo "$FILE" | sed...для передачи содержимого FILEв sedпо конвейеру.

Обратите внимание, что даже это неправильно, некоторые версии echoбудут обрабатывать обратную косую черту как escape-символы, что приводит к путанице. Вам понадобится printf "%s\n" "$FILE" | sed..., чтобы он работал во всех оболочках. См.:Почему printf лучше, чем echo?

Кроме того, обратите внимание, что поведение sedпо умолчанию заключается в печати строки после любых операций, которые она выполняет. Когда вы используете /pв команде s///, это вызывает дополнительную печать, поэтому вы получаете результат дважды на выходе.

Тем не менее, поскольку вы используете Bash, вы можете просто использовать расширение замены строки:

#!/bin/bash
FILE='\\edi3\welshch\test'
FILEPATH=${FILE//\\//}
echo "$FILEPATH"

дает результат//edi3/welshch/test

1
01.07.2020, 22:35
2 ответа

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

sed 's/  *\( HE2B[0-9][0-9]*GLN\)/\1/g;' NEW2.pdbqt > NEW3.pdbqt

Эта проблема возникает только у строк HE2Bили у всех? И только 3-е поле в файле, или есть другие экземпляры с несколькими пробелами? Вы можете использовать это, чтобы раздавить все экземпляры нескольких пробелов во всех строках, чтобы в строке всегда был только один пробел:

sed 's/   */ /g;' NEW2.pdbqt > NEW3.pdbqt

И если у вас есть проблемы с начальными и/или конечными пробелами, вы также можете обрезать их:

sed 's/^  *//; s/  *$//; s/   */ /g;' NEW2.pdbqt > NEW3.pdbqt

Выполнение вышеуказанного в этом файле (, где я использую "!" для обозначения завершающих пробелов):

   ATOM    1698 NE2AGLN A 400 14.237 -14.941 -28.964 0.50 19.10 -0.370 N
ATOM 1699 HE2A1GLN A 400 15.059 -14.399 -28.698 1.00 0.00 0.159 HD
ATOM 1700    HE2A2GLN A 400 13.869 -15.668 -28.351      1.00 0.00 0.159 HD
ATOM 1701 NE2BGLN A 400 11.754 -15.026 -32.239 0.50 15.67 -0.370 N
ATOM 1702  HE2B1GLN A 400 11.970 -15.937 -31.835 1.00 0.00 0.159 HD!!
ATOM 1703       HE2B2GLN A 400 11.794 -14.906 -33.251 1.00 0.00 0.159 HD
          ATOM 1704 N ASP A 401 10.553 -18.216 -28.161 1.00 15.63 -0.231 NA!!!!
ATOM 1705 CA AASP A 401 10.830 -19.591 -27.761 0.50 16.06 0.160 C

производит это:

ATOM 1698 NE2AGLN A 400 14.237 -14.941 -28.964 0.50 19.10 -0.370 N
ATOM 1699 HE2A1GLN A 400 15.059 -14.399 -28.698 1.00 0.00 0.159 HD
ATOM 1700 HE2A2GLN A 400 13.869 -15.668 -28.351 1.00 0.00 0.159 HD
ATOM 1701 NE2BGLN A 400 11.754 -15.026 -32.239 0.50 15.67 -0.370 N
ATOM 1702 HE2B1GLN A 400 11.970 -15.937 -31.835 1.00 0.00 0.159 HD
ATOM 1703 HE2B2GLN A 400 11.794 -14.906 -33.251 1.00 0.00 0.159 HD
ATOM 1704 N ASP A 401 10.553 -18.216 -28.161 1.00 15.63 -0.231 NA
ATOM 1705 CA AASP A 401 10.830 -19.591 -27.761 0.50 16.06 0.160 C
1
18.03.2021, 23:23

Я считаю, что вам нужно знать:

  1. Если удалить один пробел перед полем, выравнивание по-прежнему будет неправильным:
$ str=$(head -n 2 NEW2.pdbqt)

$ echo "$str" | sed "s/ HE2A1GLN/HE2A1GLN/"

1. ATOM   1698  NE2AGLN A 400      14.237 -14.941 -28.964  0.50 19.10    -0.370 N 
2. ATOM   1699 HE2A1GLN A 400      15.059 -14.399 -28.698  1.00  0.00     0.159 HD
  1. Итак, возможно, вам нужно добавить один пробел для других строк:
$ echo "$str" | sed '/HE2A1GLN/!s/.*GLN/& /'

1. ATOM   1698  NE2AGLN  A 400      14.237 -14.941 -28.964  0.50 19.10    -0.370 N 
2. ATOM   1699  HE2A1GLN A 400      15.059 -14.399 -28.698  1.00  0.00     0.159 HD
  1. Или с помощью GNU sed измените 7-й пробел:
$ echo "$str" | sed '/HE2A1GLN/!s/ /  /7'
1. ATOM   1698  NE2AGLN  A 400      14.237 -14.941 -28.964  0.50 19.10    -0.370 N 
2. ATOM   1699  HE2A1GLN A 400      15.059 -14.399 -28.698  1.00  0.00     0.159 HD
  1. Конечно, приведенному выше будет соответствовать только одна строка, та, в которой есть HE2A1GLN. Чтобы сопоставить больше строк, вы попробовали цикл с $i. Но чтобы заставить его работать правильно, вам нужно разграничить переменную ${i}(, пожалуйста, используйте небольшой файл, чтобы попробовать эти примеры, они будут генерировать много строк):
for i in {1..10}
do
echo "${i}"

    sed "s/  HE2A${i}GLN/ HE2A${i}GLN/g" NEW2.pdbqt

done

в противном случае весь текст $iGLNбудет восприниматься как имя переменной и будет заменен ничем (, так как переменной с таким именем не существует ).

  1. Но регулярные выражения могут сопоставлять несколько символов сами по себе. Чтобы сопоставить Aили B, используя[AB](строки 2,3 и 5,6 ), вы можете сделать:
for i in {1..10}; do
    sed "s/ \(HE2[AB]${i}GLN\)/\1/" NEW2.pdbqt
done
  1. И регулярные выражения также могут сопоставлять числа, никаких циклов, один sed для всего этого:
sed "s/ \(HE2[AB][12]GLN\)/\1/" NEW2.pdbqt
  1. Но, знаете ли, есть гораздо более простой, быстрый и легкий способ разбить файл на столбцы:column -t:
$ column -t NEW2.pdbqt

1.  ATOM  1698  NE2AGLN   A     400  14.237  -14.941  -28.964  0.50     19.10  -0.370  N
2.  ATOM  1699  HE2A1GLN  A     400  15.059  -14.399  -28.698  1.00     0.00   0.159   HD
3.  ATOM  1700  HE2A2GLN  A     400  13.869  -15.668  -28.351  1.00     0.00   0.159   HD
4.  ATOM  1701  NE2BGLN   A     400  11.754  -15.026  -32.239  0.50     15.67  -0.370  N
5.  ATOM  1702  HE2B1GLN  A     400  11.970  -15.937  -31.835  1.00     0.00   0.159   HD
6.  ATOM  1703  HE2B2GLN  A     400  11.794  -14.906  -33.251  1.00     0.00   0.159   HD
7.  ATOM  1704  N         ASP   A    401     10.553   -18.216  -28.161  1.00   15.63   -0.231  NA
8.  ATOM  1705  CA        AASP  A    401     10.830   -19.591  -27.761  0.50   16.06   0.160   C

Конечно, это не предназначено для работы со столбцами, содержащими пробелы. Вам нужно восстановить 4-й столбец в строках 7 и 8 (, например ). Если бы вы могли заменить пробелы в таком столбце на _, то:

$ awk '{print substr($0,1,16) gensub(/ /,"_","g",substr($0,17,7)) substr($0,24)}' NEW2.pdbqt | 
    column -t

1.  ATOM  1698  NE2AGLN   A  400  14.237  -14.941  -28.964  0.50  19.10  -0.370  N
2.  ATOM  1699  HE2A1GLN  A  400  15.059  -14.399  -28.698  1.00  0.00   0.159   HD
3.  ATOM  1700  HE2A2GLN  A  400  13.869  -15.668  -28.351  1.00  0.00   0.159   HD
4.  ATOM  1701  NE2BGLN   A  400  11.754  -15.026  -32.239  0.50  15.67  -0.370  N
5.  ATOM  1702  HE2B1GLN  A  400  11.970  -15.937  -31.835  1.00  0.00   0.159   HD
6.  ATOM  1703  HE2B2GLN  A  400  11.794  -14.906  -33.251  1.00  0.00   0.159   HD
7.  ATOM  1704  N___ASP   A  401  10.553  -18.216  -28.161  1.00  15.63  -0.231  NA
8.  ATOM  1705  CA_AASP   A  401  10.830  -19.591  -27.761  0.50  16.06  0.160   C

Должен работать, если столбец 4 содержит не менее 7 символов.

-1
18.03.2021, 23:23

Теги

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