Замените \n пробелом в файле

[1176233]Основная проблема здесь в том, что расширение [1176683]${PARAMETER/PATTERN/STRING}[1176684] [1176685]PATTERN[1176686] не принимает массив, как это делает [1176687]PARAMETER[1176688], а значит [1176689]${arr[@]}[11766690] расширяется до [1176691] "% > #"[1176692]. [12121]Эффект этого можно увидеть, если добавить несколько файлов:[12122]Ваша команда приведет к:[12123]Последняя строка, надеюсь, точно покажет, что происходит. [12124]Другой предложил использовать конвейер [1176693]$f[1176694] через [1176695]sed[1176696] и делать там магию, и это было бы неплохим вариантом, так как это позволило бы сделать более сложные преобразования, однако предполагая, что вы хотите удалить только ведущие символы, достаточно использовать расширение параметра bash [1176697]${PARAMETER#WORD}[12125][1176700]: [12126]Для себя эта строка приводит к:[12127]Я вызываю паттерн [1176701]$gpat[1176702], так как это и есть паттерн [1176703]bash globbing[1176704]. Это [1176705]не[1176706] регулярное выражение.[12128] Обратите внимание, что [1176707]${PAR#WORD}[1176708] не жадный и соответствует кратчайшему возможному шаблону - [1176709]${PAR##WORD}[1176710] соответствует кратчайшему возможному шаблону. Однако, с [1176711]gpat="[%>#]"[1176712], который все равно будет соответствовать только одному символу: [12129] Если у нас есть опция оболочки [1176713]extglob[1176714] (сверьтесь с [1176715]shopt extglob[1176716], установленная с [1176717]shopt -s extglob[1176718], отмененная с [1176719]shopt -u extglob[1176720] - она, вероятно, установлена, если у вас есть разумный [1176721]bashrc[1176722]), то мы можем использовать расширенные шаблоны глобуса: [12130] примечательно, что во всех приведенных выше примерах [1176723]"% > #somefile. txt"[1176724] становится [1176725]". > #somefile.txt"[1176726] из-за пробела, следующего за % не захватываемого паттерном[12131]Конечно, [1176727]${PARAMETER/PATTERN/STRING}[1176728] (и похожий [1176729]//[1176730]) также принимают шаблоны глобуса, но я понял это (буквально) только по мере того, как печатаю эти слова, и мне не очень-то и надоело возвращаться к вышеописанному, чтобы настроить его на отражение этого. В любом случае, это работает точно так же, и, конечно, вы захотите использовать [1176731]PAR/PAT/[1176732] только для удаления символов середины строки.[1176254].
1
01.03.2019, 05:31
6 ответов

От поста:

Я попробовал ниже команды, но не в состоянии заменить, пожалуйста, сделайте все необходимое.

 Cat Out |  tr '\ n' '' '
 

Проблема с приведенным выше командой: TR понимает \ N как «Новый символ линии»

из MANPAGE :

$ man tr | grep Interpreted -A 18
       SETs are specified as strings of characters.  Most represent themselves.  Interpreted sequences are:

       \NNN   character with octal value NNN (1 to 3 octal digits)

       \\     backslash

       \a     audible BEL

       \b     backspace

       \f     form feed

       \n     new line

       \r     return

       \t     horizontal tab

       \v     vertical tab

Укажите \ N Вам необходимо указать [Backslash] [n] IE \\ n (см. Спецификацию, перечисленные выше). Таким образом, используйте следующую команду:

tr -s '\\n' ' '

на CAT File1 и Redirect (> ) - file2 Использование:

cat file1 | tr -s '\\n' ' ' > file2

Но проблема с использованием TR - это то, что он переводится каждый \ и n n для пространства .

Итак, я рекомендую использовать SED следующим образом:

Команда для SED SED SED SED ( Sed 'S / Old-string / New-String / G' In> Out ):

sed 's/\\n/ /g' file1 > file2

здесь только \ N (все слово) будет преобразовано в пространство

1
27.01.2020, 23:17

Вы можете попробовать трюк!

Сначала избавляйтесь от «n» в конце файла:

cat "your_file.txt" | sed -e 's/\<n\>//g' > "new_file.txt"

затем избавьтесь от символа «\»:

cat "new_file.txt" | tr -s "\\" " " > "final_file.txt"

, и у вас будет вывод без \ n.

-1
27.01.2020, 23:17

Много хороших ответов, добавлю sed путь

 sed 's#\\n##g' file1 >  file2
3
27.01.2020, 23:17

можно использовать tr

tr -d '\\n' < input_file > output_file

-1
27.01.2020, 23:17

Если вы хотите заменить два символа \ и n в конце каждой строки с пространством, используйте

sed 's/\\n$/ /' < file1

Обратите внимание, что ваш Пример выхода имеет несколько пробелов после A и одно пространство после D , но указанная команда всегда помещает одно пространство.

1
27.01.2020, 23:17

Альтернативой будет взять только первый символ, используя cut:

$ cut -c1 < input_file 
A
D
2
27.01.2020, 23:17

Теги

Похожие вопросы