Внутри подстановки команд у вас есть "$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
Скорее всего, вы могли бы просто запустить один оператор 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
Я считаю, что вам нужно знать:
$ 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
$ 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
$ 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
HE2A1GLN
. Чтобы сопоставить больше строк, вы попробовали цикл с $i
. Но чтобы заставить его работать правильно, вам нужно разграничить переменную ${i}
(, пожалуйста, используйте небольшой файл, чтобы попробовать эти примеры, они будут генерировать много строк):for i in {1..10}
do
echo "${i}"
sed "s/ HE2A${i}GLN/ HE2A${i}GLN/g" NEW2.pdbqt
done
в противном случае весь текст $iGLN
будет восприниматься как имя переменной и будет заменен ничем (, так как переменной с таким именем не существует ).
A
или B
, используя[AB]
(строки 2,3 и 5,6 ), вы можете сделать:for i in {1..10}; do
sed "s/ \(HE2[AB]${i}GLN\)/\1/" NEW2.pdbqt
done
sed "s/ \(HE2[AB][12]GLN\)/\1/" NEW2.pdbqt
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 символов.