Команда cat
может принимать -
в качестве маркера для stdin .(POSIX , " Если файл ' -', утилита cat должна прочитать стандартный ввод в этой точке последовательности. " )Это позволяет легко обрабатывать файл или стандартный ввод , где в противном случае это было бы запрещено.
Рассмотрим эти две тривиальные альтернативы, где аргумент оболочки $1
равен-
:
cat "$1" | nl # Works completely transparently
nl < "$1" # Fails with 'bash: -: No such file or directory'
Другой случай cat
полезен, когда он преднамеренно используется как операция no -просто для поддержания синтаксиса оболочки:
file="$1"
reader=cat
[[ $file =~ \.gz$ ]] && reader=zcat
[[ $file =~ \.bz2$ ]] && reader=bzcat
"$reader" "$file"
Наконец, я считаю, что единственный случай, когда UUOC действительно может быть правильно вызван, это когда cat
используется с именем файла, которое, как известно, является обычным файлом (, то есть не устройством или именованным каналом ), и что команде не даются флаги:
cat file.txt
В любой другой ситуации могут потребоваться операции самого cat
.
Вы можете попробовать это:
sed 's/\[b37\]\(.\),/:\1:/' 1kG_MDS5.bim
Выход:
1 rs58108140 0 10583 A G
1 1:11508:A:G 0 11508 A G
1 1:15820:G:T 0 15820 T G
1 1:16257:C:G 0 16257 C G
1 1:16378:C:T 0 16378 T C
Проблема в вашем шаблоне заключается в том, что скобки не экранированы, поэтому sed
пытается заменить вхождения b, 3 и 7, а не строку «[b37]».