2013-12-13 2 views
1

у меня есть несколько файлов, в которых я хочу, чтобы заменить определенное слово с именем самого файла ..как использовать имя входного файла в СЭД заменить

, например, у меня есть 2 файла с именем test1. TXT и test2.txt

оба файла одинаковы и похожи

 
bla1,bla2,temp 
bla2,bla3,temp 

с СЭД я хочу, чтобы заменить темп слово с именем самого файла

так после го е СЭД работа у меня есть 2 разных файлов

test1.txt, который выглядит следующим образом:

 
bla1,bla2,test1 
bla2,bla3,test1 

test2.txt, который выглядит как:

 
bla1,bla2,test2 
bla2,bla3,test2 

поэтому мой вопрос ... как сделать Я использую фактическое имя самого входного файла как часть команды replace?

sed "s/temp/ ??filename??/ ??? " *.txt 

спасибо за ваши предложения

ответ

3

Я не уверен, что вы можете ссылаться на имя файла с помощью sed хотя я могу ошибаться. Вероятно, вы использовали бы раковину . Лучше заменить Подход все вхождения temp с именем файла будет следующим awk сценарий:

$ awk '{gsub(/temp/,FILENAME)}1' file 
+0

Черт! Я отправляю свой смехотворный длинный ответ, не понимая, что в awk есть переменная. Хороший. – chooban

+0

привет, ВСЕ, спасибо большое .. очень впечатлен этими быстрыми ответами !!! – user3099593

+0

@ user3099593 на stackoverflow так, как вы показываете, что на вас впечатлили ответ, - это увеличить его * (когда вы получите достаточную репутацию) *. Теперь вы должны принять ответ, наиболее полезный для вас, щелкнув галочку рядом с этим ответом. –

1

Использование AWK, AWK имеет FILENAME переменную:

awk '{sub(/temp/,FILENAME)}7' yourfile 
0

Вы можете сделать это с немного Баш, чтобы помочь вам, если это доступно.

find . -name "test*.txt" -type f | awk -F '/' '{print $2;}' | while read file; do sed -i "s|temp|$file|" ./$file; done 

Это своего рода хакерская адаптация сценария. Я должен сделать что-то подобное. Это, несомненно, может быть сокращено.

+1

Нет. Нет, нет, нет. И, наконец, нет. :-) Не только вышеописанный длинный и неэффективный, он имеет несколько коварных ошибок, которые помогут вам разобраться в различных именах файлов. –

+0

Вам не нравится? :) – chooban

+0

Нет, это прекрасно :-). –

1
awk 'BEGIN{FS=OFS=","} {$NF=FILENAME}1' file 

Разница между этим и к югу() решения является то, что это будет работать, даже если слово «Темп» существует в другом месте в файле, например, если «bla1» содержит слово «температура».

Если вам необходимо лишить «.txt» из имени файла, как это видно из Вашего публикуемую желаемого результата, подправить его:

awk 'BEGIN{FS=OFS=","} {t=FILENAME; sub(/\.txt$/,"",t); $NF=t}1' file 

Вы, вероятно, можете редактировать FileName себя, но я считаю, что лучше не беспорядок с встроенными переменными, если вам это не нужно.

+1

Я не был уверен, был ли пример представительным, если это было бы лучшим решением. –

+0

Если это не так, мы стреляем в темноту :-) –

+0

Разве мы не всегда. Просто иногда ОП имеют более яркие прикосновения, чем другие, и обращены в правильном направлении. –

0

не СЕПГ внутренних переменный для имени файла, так что вам нужна немного предыдущей команды пакетной для общего процесса

for FileName in MyFileShellFilter 
do 
    cat <> ${FileName} | sed "s|,temp$|,${FileName}|" 
done 

быть просто carrefull с именем файла, используемым, они нормально не \, но могут иметь & что есть s// особый смысл.Я использую | в качестве разделителя, чтобы / в имени файла, но по этой причине, не неэкранированный | не разрешены в имени файла (нормально не)

+1

Также следите за именами файлов, содержащими пробелы, или * s или любым другим символом глобуса, поскольку они вызовут нежелательные результаты и будут знать, что оболочка может решить перезаписать ваш файл, прежде чем он откроет его для чтения, чтобы вы могли получить пустую файл. –

+0

хорошие примечания (+1), мне нужно окружить «$ {filename}» на уровне кошки. * Sis normaly, расширенный оболочкой перед тем, как перейти в цикл. – NeronLeVelu

+0

Да, самая большая проблема в том, что 'cat <> file | foo' может интерпретироваться оболочкой так, что первое, что делает оболочка, это '' файл ', поэтому он немедленно заглаживает ваш входной файл и THEN' cat

0

с xargs:

printf "%s\n" *.txt | xargs -I FILE -L 1 sed 's/temp/FILE/' FILE 

Имя файла не может быть: символы новой строки, слэш , амперсанд, одинарная кавычка.

Смежные вопросы