Другой способ справиться с этим — просто использовать NUL -с разделителямиprintf
следующим образом:
rsync -0 --include-from=<(printf 'p4.%d\0' {42..67}).
Есть несколько возможных способов добиться желаемого. Предполагая, что ваш входной файл называется input.txt
, а ваш выходной файл -образно -output.txt
, следующее должно работать:
1. Подход с использованием awk
иcut
awk '/^-/' input.txt | cut -d "," -f 2- > output.txt
Это указывает awk
сопоставлять каждую строку input.txt
, которая начинается с -
, и печатать совпадающую строку (это действие по умолчанию, поэтому его не нужно указывать явно )в стандартный вывод.
Это передается в качестве входных данных в cut
, который разделяет строки по каждой запятой(-d ","
)и печатает все поля, идентифицированные таким образом, но начиная с второго (-f 2-
), таким образом опуская начальный -
, который вы хотите избавиться.
Затем вывод перенаправляется в файл.
Если вам интересно, вы можете найти дополнительную информацию в GNU Awk User's Guide .
2. Подход с использованием grep
иcut
В этой довольно «простой» настройке вы также могли бы использовать grep
вместо awk с аналогичным эффектом:
grep "^-" input.txt | cut -d "," -f 2- > output.txt
Регулярное выражение, которое нужно использовать, такое же, как :соответствует -
, но только если оно появляется в качестве первого символа строки (это значение предшествующего^
).
3. Подход с использованиемsed
Наконец, вы также можете использовать sed
для достижения этого
sed -e "/^[^-]/d" -e "s/^-,//" input.txt > output.txt
Это указывает sed
на обработку input.txt
с использованием двух правил.
-
в начале :Первый ^
по-прежнему означает, что следующий символ должен отображаться в качестве первого символа в строке, но в выражении в [... ]
это означает «все, кроме a -
». Если такая строка будет найдена, она будет удалена (не волнуйтесь,sed
не затрагивает ваш входной файл, если вы не укажете опцию -i
). s/.../.../
)ведущий -,
на... ничего (и, следовательно, удалите его ). Вывод снова перенаправляется в файл.
Как указал @Sundeep, это также можно превратить в более компактное единое правило, заявив
sed -n 's/^-,//p' input.txt > output.txt
, который предписывает sed
удалить начальные -,
во всех строках, начинающихся таким образом, и напечатать (только )совпадающие строки (конечные p
), снова перенаправляя вывод на файл. Обратите внимание , что опция -n
важна здесь для подавления вывода так -называемого пространства шаблонов , которое будет мешать тому, чего вы хотите достичь.