Создать несколько копий файла с одной строкой в каждой измененной копии

Чтобы поместить одинарные кавычки в командную строку, используйте двойные кавычки или обратную косую черту:

test.sh "'test'"
test.sh \'test\'

Но, судя по вашему сообщению, ваша настоящая проблема в другом:

Я не могу изменить то, что находится внутри переменной

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

test.sh "$var"
0
28.06.2018, 23:34
2 ответа

базовый метод может быть похож на этот в примере, я изменяю значение a= по числам, а файлы и имена файлов также имеют значение внутри, поэтому файлы разделены

#!/bin/bash


for i in a b c 1 2 3  ; do
    cat > file${i} << EOT
! input file
a = ${i}
b = 6
d = 789
! end
EOT
done

так что вы получите 6 файлов с 6 разным содержимым как:

# cat file?
! input file
a = 1
b = 6
d = 789
! end
! input file
a = 2
b = 6
d = 789
! end
! input file
a = 3
b = 6
d = 789
! end
! input file
a = a
b = 6
d = 789
! end
! input file
a = b
b = 6
d = 789
! end
! input file
a = c
b = 6
d = 789
! end

если вам нужно прочитать значение b из справочного файла вы можете использовать переменную из подкоманды чтения, например

while read ; do
cat > file${REPLY} << EOT
! input file
a = 1
b = ${REPLY}
d = 789
! end
EOT
done < referencefile

полный пример в реальном состоянии:

[root@h2g2w tmp]# cat >./test.sh
while read ; do
cat > file${REPLY} << EOT
! input file
a = 1
b = ${REPLY}
d = 789
! end
EOT
done < referencefile


[root@h2g2w tmp]# cat > referencefile 
qsd
gfd
eza
vxcv
bxc
[root@h2g2w tmp]# 
[root@h2g2w tmp]# sh./test.sh 
[root@h2g2w tmp]# ls -lrth file???
-rw-r--r--. 1 root root 41 28 juin  22:47 fileqsd
-rw-r--r--. 1 root root 41 28 juin  22:47 filegfd
-rw-r--r--. 1 root root 41 28 juin  22:47 fileeza
-rw-r--r--. 1 root root 41 28 juin  22:47 filebxc
[root@h2g2w tmp]# cat file???
! input file
a = 1
b = bxc
d = 789
! end
! input file
a = 1
b = eza
d = 789
! end
! input file
a = 1
b = gfd
d = 789
! end
! input file
a = 1
b = qsd
d = 789
! end
[root@h2g2w tmp]# 

Надеюсь, теперь вы сможете адаптировать это под свои нужды.

1
28.01.2020, 02:42

Только с bash :файл называется "файл"

# slurp the whole file into a variable
contents=$(< file)

# find the value of b, using regular expression
# - with bash regex, the literal parts are quoted and the metachars are not
if [[ $contents =~ "b = "([0-9]+) ]]; then
    b_val=${BASH_REMATCH[1]}

    # create a printf-style format string
    template=${contents/b = $b_val/b = %d}

    # then, count down from the b value to 1, creating the new files
    for (( n = b_val; n >= 1; n-- )); do
        printf "$template\n" $n > "file.$n"
    done
fi

Тогда:

$ ls -lt
total 6220
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.1
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.2
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.3
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.4
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.5
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:46 file.6
-rw-rw-r-- 1 jackman jackman      39 Jun 28 17:35 file
...

$ grep ^b file{,.?}
file:b = 6
file.1:b = 1
file.2:b = 2
file.3:b = 3
file.4:b = 4
file.5:b = 5
file.6:b = 6
0
28.01.2020, 02:42

Теги

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