使用 bash 脚本根据用户输入编辑文件
Edit a file based on user's input using bash script
我有以下file.dev
1 DEVICES {
2 GLOBAL-CONFIG {
3 framerate = "20000";
4 subframes = "0";
5 max_consec_timeouts = "10";
6 max_total_timeouts = "1000";
7 schedmode = "Standard";
8 clustermode = "Standard";
9 }
10 IO-DEVICES {
11 }
12 COMPUTING-DEVICES {
13 RT_WORKSTATION FDT-C-XM-0120 = {
14 hostname = "FDT-C-XM-0120";
15 ipaddress = "fdt-c-XM-0120.fdtel.exter";
16 DISPLAYS {
17 main = "FDT-C-XM-0120:0.0";
18 }
19 SCHEDPARAM {
20 active = "0";
21 framerate = "20000";
22 subframes = "0";
23 max_consec_timeouts = "10";
24 max_total_timeouts = "1000";
25 }
26 }
27
28 RT_HOST fdt-c-agx-0008 = {
29 hostname = "fdt-c-agx-0008";
30 ipaddress = "fdt-c-agx-0008";
31 SCHEDPARAM {
32 active = "0";
33 framerate = "20000";
34 subframes = "0";
35 max_consec_timeouts = "10";
36 max_total_timeouts = "1000";
37 }
38 }
39
40 # RT_HOST fdt-c-agx-0003 = {
41 # hostname = "fdt-c-agx-0003";
42 # ipaddress = "fdt-c-agx-0003.fdtel.exter";
43 # SCHEDPARAM {
44 # active = "0";
45 # framerate = "20000";
46 # subframes = "0";
47 # max_consec_timeouts = "10";
48 # max_total_timeouts = "1000";
49 # }
50 # }
51 }
52 }
在此文件中,文本部分 第 1 部分 (from line 28 till 38)
和 第 2 部分 (from line 40 till 50)
是用户之间切换。正如我们所见,第 2 部分被注释掉,第 1 部分处于活动状态。
所以我正在尝试使用 bash 脚本自动执行此操作,用户只需输入他想要的部件号,而另一个被注释掉。这样使用一定不要注释掉每一行。
# example
if [ "$userEntry" = "part2"]
then
deactivate part one by typing adding from line 28 till 38 and activate part 2 by removing the #
输出看起来像
1 DEVICES {
2 GLOBAL-CONFIG {
3 framerate = "20000";
4 subframes = "0";
5 max_consec_timeouts = "10";
6 max_total_timeouts = "1000";
7 schedmode = "Standard";
8 clustermode = "Standard";
9 }
10 IO-DEVICES {
11 }
12 COMPUTING-DEVICES {
13 RT_WORKSTATION FDT-C-XM-0120 = {
14 hostname = "FDT-C-XM-0120";
15 ipaddress = "fdt-c-XM-0120.fdtel.exter";
16 DISPLAYS {
17 main = "FDT-C-XM-0120:0.0";
18 }
19 SCHEDPARAM {
20 active = "0";
21 framerate = "20000";
22 subframes = "0";
23 max_consec_timeouts = "10";
24 max_total_timeouts = "1000";
25 }
26 }
27
28 # RT_HOST fdt-c-agx-0008 = {
29 # hostname = "fdt-c-agx-0008";
30 # ipaddress = "fdt-c-agx-0008";
31 # SCHEDPARAM {
32 # active = "0";
33 # framerate = "20000";
34 # subframes = "0";
35 # max_consec_timeouts = "10";
36 # max_total_timeouts = "1000";
37 # }
38 # }
39
40 RT_HOST fdt-c-agx-0003 = {
41 hostname = "fdt-c-agx-0003";
42 ipaddress = "fdt-c-agx-0003.fdtel.exter";
43 SCHEDPARAM {
44 active = "0";
45 framerate = "20000";
46 subframes = "0";
47 max_consec_timeouts = "10";
48 max_total_timeouts = "1000";
49 }
50 }
51 }
52 }
请注意,file.dev 中的行顺序不会更改。
我希望我能把我的问题说清楚,谢谢
与ed
如果是available/acceptable.
#!/usr/bin/env bash
if [[ "$userEntry" == "part2" ]]; then
printf '%s\n' '40,50s/^[[:blank:]]*#//' '28,38s/^/#/' ,p Q |
ed -s file.txt
fi
只会将新输出打印到 stdout
,但文件不会是 change/edited。如果需要 就地 编辑,请将 Q
更改为 w
。删除 ,p
以使输出静音。
和sed
sed '40,50s/^[[:blank:]]*#//;28,38s/^/#/' file.txt
请注意,如果需要 就地 编辑,则在使用 -i
标志时,不同的 sed
版本具有不同的语法。
根据 OP 的解释。
#!/usr/bin/env bash
part1=28
part2=40
if [[ "$userEntry" == "part2" ]]; then
if [[ $(grep -nm1 \# file.txt | cut -d':' -f1) == "$part2" ]]; then
sed '40,50s/^[[:blank:]]*#*//;28,38s/^/#/' file.txt
else
sed '28,38s/^/#/' file.txt
fi
elif [[ "$userEntry" == "part1" ]]; then
if [[ $(grep -nm1 \# file.txt | cut -d':' -f1) == "$part1" ]]; then
sed '28,38s/^[[:blank:]]*#*//;40,50s/^/#/' file.txt
else
sed '40,50s/^/#/' file.txt
fi
fi
需要 GNU grep(1)
我有以下file.dev
1 DEVICES {
2 GLOBAL-CONFIG {
3 framerate = "20000";
4 subframes = "0";
5 max_consec_timeouts = "10";
6 max_total_timeouts = "1000";
7 schedmode = "Standard";
8 clustermode = "Standard";
9 }
10 IO-DEVICES {
11 }
12 COMPUTING-DEVICES {
13 RT_WORKSTATION FDT-C-XM-0120 = {
14 hostname = "FDT-C-XM-0120";
15 ipaddress = "fdt-c-XM-0120.fdtel.exter";
16 DISPLAYS {
17 main = "FDT-C-XM-0120:0.0";
18 }
19 SCHEDPARAM {
20 active = "0";
21 framerate = "20000";
22 subframes = "0";
23 max_consec_timeouts = "10";
24 max_total_timeouts = "1000";
25 }
26 }
27
28 RT_HOST fdt-c-agx-0008 = {
29 hostname = "fdt-c-agx-0008";
30 ipaddress = "fdt-c-agx-0008";
31 SCHEDPARAM {
32 active = "0";
33 framerate = "20000";
34 subframes = "0";
35 max_consec_timeouts = "10";
36 max_total_timeouts = "1000";
37 }
38 }
39
40 # RT_HOST fdt-c-agx-0003 = {
41 # hostname = "fdt-c-agx-0003";
42 # ipaddress = "fdt-c-agx-0003.fdtel.exter";
43 # SCHEDPARAM {
44 # active = "0";
45 # framerate = "20000";
46 # subframes = "0";
47 # max_consec_timeouts = "10";
48 # max_total_timeouts = "1000";
49 # }
50 # }
51 }
52 }
在此文件中,文本部分 第 1 部分 (from line 28 till 38)
和 第 2 部分 (from line 40 till 50)
是用户之间切换。正如我们所见,第 2 部分被注释掉,第 1 部分处于活动状态。
所以我正在尝试使用 bash 脚本自动执行此操作,用户只需输入他想要的部件号,而另一个被注释掉。这样使用一定不要注释掉每一行。
# example
if [ "$userEntry" = "part2"]
then
deactivate part one by typing adding from line 28 till 38 and activate part 2 by removing the #
输出看起来像
1 DEVICES {
2 GLOBAL-CONFIG {
3 framerate = "20000";
4 subframes = "0";
5 max_consec_timeouts = "10";
6 max_total_timeouts = "1000";
7 schedmode = "Standard";
8 clustermode = "Standard";
9 }
10 IO-DEVICES {
11 }
12 COMPUTING-DEVICES {
13 RT_WORKSTATION FDT-C-XM-0120 = {
14 hostname = "FDT-C-XM-0120";
15 ipaddress = "fdt-c-XM-0120.fdtel.exter";
16 DISPLAYS {
17 main = "FDT-C-XM-0120:0.0";
18 }
19 SCHEDPARAM {
20 active = "0";
21 framerate = "20000";
22 subframes = "0";
23 max_consec_timeouts = "10";
24 max_total_timeouts = "1000";
25 }
26 }
27
28 # RT_HOST fdt-c-agx-0008 = {
29 # hostname = "fdt-c-agx-0008";
30 # ipaddress = "fdt-c-agx-0008";
31 # SCHEDPARAM {
32 # active = "0";
33 # framerate = "20000";
34 # subframes = "0";
35 # max_consec_timeouts = "10";
36 # max_total_timeouts = "1000";
37 # }
38 # }
39
40 RT_HOST fdt-c-agx-0003 = {
41 hostname = "fdt-c-agx-0003";
42 ipaddress = "fdt-c-agx-0003.fdtel.exter";
43 SCHEDPARAM {
44 active = "0";
45 framerate = "20000";
46 subframes = "0";
47 max_consec_timeouts = "10";
48 max_total_timeouts = "1000";
49 }
50 }
51 }
52 }
请注意,file.dev 中的行顺序不会更改。
我希望我能把我的问题说清楚,谢谢
与ed
如果是available/acceptable.
#!/usr/bin/env bash
if [[ "$userEntry" == "part2" ]]; then
printf '%s\n' '40,50s/^[[:blank:]]*#//' '28,38s/^/#/' ,p Q |
ed -s file.txt
fi
只会将新输出打印到 stdout
,但文件不会是 change/edited。如果需要 就地 编辑,请将 Q
更改为 w
。删除 ,p
以使输出静音。
和sed
sed '40,50s/^[[:blank:]]*#//;28,38s/^/#/' file.txt
请注意,如果需要 就地 编辑,则在使用 -i
标志时,不同的 sed
版本具有不同的语法。
根据 OP 的解释。
#!/usr/bin/env bash
part1=28
part2=40
if [[ "$userEntry" == "part2" ]]; then
if [[ $(grep -nm1 \# file.txt | cut -d':' -f1) == "$part2" ]]; then
sed '40,50s/^[[:blank:]]*#*//;28,38s/^/#/' file.txt
else
sed '28,38s/^/#/' file.txt
fi
elif [[ "$userEntry" == "part1" ]]; then
if [[ $(grep -nm1 \# file.txt | cut -d':' -f1) == "$part1" ]]; then
sed '28,38s/^[[:blank:]]*#*//;40,50s/^/#/' file.txt
else
sed '40,50s/^/#/' file.txt
fi
fi
需要 GNU grep(1)