Простой код работает для любого итеративного объекта, а не только из списков:
& gt; & gt; & gt; & gt; def empty (seq): ... try: ... return all (map (empty, seq)) ... кроме TypeError: ... return False ... & gt; & gt; & gt; & gt; empty ([]) True & gt; & gt; & gt; & gt; & gt; empty ([4]) False & gt; & gt; & gt; & gt; empty ([[]]) True & gt; & gt; & gt; & gt; empty ([[], []]) True & gt; & gt; & gt; & gt; & gt; empty ([[], [8]]) False & gt; & gt; & gt; & gt; & gt; empty ([[], (False для _ в диапазоне (0))]) True & gt; & gt; & gt; & gt; & gt; empty ([[], (False для _ в диапазоне (1))]) False & gt; & gt; & gt; & gt; empty ([[], (True для _ в диапазоне (1))]) False
Этот код делает предположение, что все, что может быть повторено, будет содержать другие элементы, и не должно считаться листом в «дереве». Если попытка перебора объекта перестает работать, то это не последовательность и, следовательно, конечно, не пустая последовательность (при этом возвращается False
). Наконец, этот код использует тот факт, что все возвращают True
, если его аргумент является пустой последовательностью.
Если ваш sed
позволяет редактировать на месте с помощью параметра -i
:
sed -e 's/$/string after each line/' -i filename
Если нет, вы должны сделать временный файл:
typeset TMP_FILE=$( mktemp )
touch "${TMP_FILE}"
cp -p filename "${TMP_FILE}"
sed -e 's/$/string after each line/' "${TMP_FILE}" > filename
sponge
: suffix=foobar
while read l ; do printf '%s\n' "$l" "${suffix}" ; done < file |
sponge file
xargs
и printf
: suffix=foobar
xargs -L 1 printf "%s$suffix\n" < file | sponge file
join
: suffix=foobar
join file file -e "${suffix}" -o 1.1,2.99999 | sponge file
paste
, yes
, head
& amp; wc
: suffix=foobar
paste file <(yes "${suffix}" | head -$(wc -l < file) ) | sponge file
Обратите внимание, что paste
вставляет символ Tab до $suffix
. Конечно sponge
можно заменить на temp файл, затем mv
'd поверх исходного имени файла, как и с некоторыми другими ответами ...
sed
, если только ресурсы не ограничены.
– agc
9 August 2018 в 17:34
Sed немного уродлив, вы могли бы сделать это элегантно, как это:
hendry@i7 tmp$ cat foo
bar
candy
car
hendry@i7 tmp$ for i in `cat foo`; do echo ${i}bar; done
barbar
candybar
carbar
cat foo
; do echo $ {i} bar; сделал foobar barbar bazbar, но после некоторых тестов я мог ошибаться в своих рассуждениях, но Деннис прав
– alex
20 May 2010 в 22:36
echo "foo bar" | (for i in `cat`; do echo ${i}bar; done)
, который печатает 2 строки, даже если вход 1 строка foo bar
(и cat
чтение из stdin вместо файла не имеет для этого никакого различия) ,
– hyde
26 November 2013 в 13:18
Если у вас есть это, утилита lam (ламинат) может сделать это, например:
$ lam filename -s "string after each line"
Я предпочитаю использовать awk
. Если есть только один столбец, используйте $0
, иначе замените его на последний столбец.
Один из способов,
awk '{print $0, "string to append after each line"}' file > new_file
или это,
awk '$0=$0"string to append after each line"' file > new_file
NR
: awk '{print $0, NR}'
– andrybak
29 June 2017 в 13:55
touch
временный файл? И я сделал бы командуsed
условной на успехcp
или оригинал мог быть потерян. – Dennis Williamson 20 May 2010 в 01:19sed -e 's/^/string after each line/' -i filename
$ означает конец строки. ^ означает начало строки. – Tom DeGisi 28 February 2012 в 17:43