Замена табуляции на запятую в скрипте оболочки OSX bash, не выдает такой ошибки файла

#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:

Я понял это! Похоже, было две проблемы:

  1. Скрипт не выполнялся в папке, в которой он находился, отсюда и ошибка «Нет такого файла».
  2. 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