#bash #macos #shell #terminal
#bash #macos #оболочка #терминал
Вопрос:
Я пытаюсь создать скрипт в OSX 10.12 для замены табуляции запятыми в файле UTF-16, содержащем азиатские символы, «testdata.txt «.
Я пробовал несколько вариантов сценариев, в том числе:
#!/bin/bash
sed -i '' -e's/ /,/g' testdata.txt
#!/bin/bash
sed 's/ /,/g' testdata.txt > newdata.txt
#!/bin/bash
find . -name 'testdata.txt" -print0 | xargs -0 sed -i "" "s/a/g"
Однако при запуске скриптов с помощью двойного щелчка я продолжаю получать следующую ошибку: sed: testdata.txt: No such file or directory
Я написал все обычным текстом в TextEdit, изменил расширение файла на .command
и включил их в терминале с chmod x
помощью . testdata.txt находится в той же папке, что и скрипты.
Основываясь на том, что я видел, я должен быть в состоянии сделать это с помощью одной строки кода, но независимо от того, что я делаю, я продолжаю получать эту ошибку. Есть ли что-нибудь, что я упускаю из виду?
Комментарии:
1.
'testdata.txt"
Для этого используются две разные кавычки, также команда sed является неполной.
Ответ №1:
Вы сказали, что хотите заменить tabs ( t
). Однако sed
не понимает t
, поэтому вы должны сделать это так:
#!/bin/bash
sed $'s/t/,/g' testdata.txt > newdata.txt
Знак доллара перед строками, заключенными в одинарные кавычки t
, расширяется n
, и так далее.
Комментарии:
1. Спасибо за вашу помощь. Я создал папку на рабочем столе, просто «testdata.txt » сценарий оболочки в точности такой, как вы его ввели, но я все равно продолжаю получать сообщение «Такой файл или каталог не найден».
Ответ №2:
Я нахожу tr
намного проще для транслитерации отдельных символов:
tr 't' ',' < yourFile
Комментарии:
1. Спасибо за вашу помощь. Когда я запускаю сценарий, как вы написали, я не получаю сообщение об ошибке, но содержимое «testdata.txt » совсем не изменены.
2. Просто чтобы убедиться, что символ табуляции не вызывает проблемы, я попробовал следующее:
3.
tr 'a' 'b' < testdata.txt
чтобы узнать, могу ли я изменить все экземпляры a на b, но даже если это не выдает ошибку, никаких изменений в testdata.txt (Извините, что я продолжаю делать новые комментарии, очевидно, вы не можете прервать строку на мобильном устройстве)4.
tr
это фильтр, поэтому он читаетstdin
и записываетstdout
. Если вы хотите, чтобы он записывался в новый файл, вам нужно сделатьtr 'a' 'b' < inputFile > outputFile
Ответ №3:
Я понял это! Похоже, было две проблемы:
- Скрипт не выполнялся в папке, в которой он находился, отсюда и ошибка «Нет такого файла».
sed
по-видимому, не подходит для кодировки UTF-16.
Код, который в конечном итоге сработал, выглядит следующим образом:
#!/bin/bash
cd "`dirname "$0"`" #points script to current folder
export LC_CTYPE=C #makes UTF-16 work somehow
sed $'s/t/,/g' testdata.txt > properlyformatted.csv