Может ли «echo» прекратить пропускать строку при записи в файл

#linux #bash #file #echo

#linux #bash #файл #echo

Вопрос:

Я пытаюсь отредактировать файл с помощью команды echo, но когда я делаю

 echo "hello" >> file.txt
  

это пропуск строки. Он печатает файл как:

 banana
apple

hello
  

Я не уверен, что это из echo или файл заканчивается на » n», но я хотел бы написать чуть ниже остальной части текста:

 banana
apple
hello
  

РЕДАКТИРОВАТЬ: теперь я вижу, что это не ошибка echo. Файл, вероятно, заканчивается символом «n». Есть ли способ обойти это? Могу ли я удалить это » n» или выбрать, в какой строке я хочу записать?

Комментарии:

1. Есть несколько способов удалить пустые строки из файла. Я бы посоветовал осмотреть этот сайт и unix.stackexchange.com .

2. Файл должен заканчиваться новой строкой. Похоже, что он заканчивается двумя символами новой строки.

3. Возможно, вам следует исправить то, что создало файл в первую очередь, чтобы он не добавлял пустую строку в конце.

Ответ №1:

Вот еще sed один скрипт, который не жестко кодирует номера строк.

 sed -i '' '${;s/^$/Hello/;t
i
Hello
}' file.txt 
  

Вот краткая разбивка:

  • ${ — действия в фигурных скобках должны применяться только к последней строке (выражение адреса $ )
  • s/^$/Hello/ — если эта строка пуста, замените ее на Hello
  • t — если произошла подстановка, мы закончили (переход к концу скрипта)
  • iHello — вставить Hello в новую строку (то есть, если мы не переходили на предыдущую строку)
  • } — конец фигурных скобок

Это проверено на macOS; синтаксис в других Unix, вероятно, будет немного отличаться. (В частности, в Linux -i опция не ожидает и не требует аргумента. Кроме этого, скрипт работает как таковой на Debian. Некоторые из новых строк, вероятно, можно было бы удалить, и это все равно будет работать, но это необходимо для * BSD sed .)

Ответ №2:

Я нашел способ sed полностью использовать команду с wc -l file.txt

Команда

wc -l file.txt

возвращает номер строки file.txt (в моем примере перед echo было бы 2). И мы можем выбрать, в какую строку записать наш текст с помощью команды:

 sed -i '2ihello' file.txt
  

это дало бы нам:

 banana
hello
apple
  

чтобы получить то, что я хочу, можно сделать так:

 echo "aux" >> file.txt

sed -i "3iHello" file.txt
sed '4d' file.txt
  

последняя команда удаляет строку 4, после чего файл становится:

 banana
apple
Hello