一个文件的值更改另一个文件中的相应值?
Values of one file to change corresponding value in another file?
我需要有关简单破折号脚本解决方案的帮助。读取文件值的脚本:“Install.txt”,(示例内容):
TRUE 203
TRUE 301
TRUE 602
TRUE 603
这些数字将与文件中的相同数字(在行尾)相对应:“ExtraExt.sys”,(示例内容):
# Read $[EXTRA_DIR]/diaryThumbPlace #202
# Read $[CORE_DIR]/myBorderStyle #203
# Read $[EXTRA_DIR]/mMenu #301
# Read $[EXTRA_DIR]/dDecor #501
# Read $[EXTRA_DIR]/controlPg #601
# Read $[EXTRA_DIR]/DashToDock #602
# Read $[EXTRA_DIR]/deskSwitch #603
所有行都带有标记 (#)。该脚本将取消标记与文件“install.txt”中具有相同编号的相应行。例如,TRUE 203 将取消标记以 #203
结尾的行
# Read $[CORE_DIR]/myBorderStyle #203
到(阅读前没有“#”)
Read $[CORE_DIR]/myBorderStyle #203
我搜索了 awk/sed 解决方案,但这需要一个循环来遍历 Install.txt 中的数字。
感谢任何帮助。谢谢。
你可以试试,
# store "203|301|602|603" in search variable
search=$(awk 'BEGIN{OFS=ORS=""}{if(NR>1){print "|"}print ;}' Install.txt)
sed -r "s/^# (.*#($search))$//g" ExtraExt.sys
你明白了,
# Read $[EXTRA_DIR]/diaryThumbPlace #202
Read $[CORE_DIR]/myBorderStyle #203
Read $[EXTRA_DIR]/mMenu #301
# Read $[EXTRA_DIR]/dDecor #501
# Read $[EXTRA_DIR]/controlPg #601
Read $[EXTRA_DIR]/DashToDock #602
Read $[EXTRA_DIR]/deskSwitch #603
或者,-i 文件编辑选项
sed -i -r "s/^# (.*#($search))$//g" ExtraExt.sys
使用 awk 的一个选项可能是读取第一个文件 Install.txt 并将第二个字段的值存储在 arr
中
读取第二个文件 ExtraExt.sys 您可以使用 $NF
获取最后一列的数字并将其与模式 ^#[0-9]+$
[ 匹配=18=]
如果有匹配,从匹配中删除 #
部分,只留下数字并检查数字是否在 arr
.
中
如果是,打印当前行,不带前导#
awk '
FNR==NR{
arr[]
next
}
match ($NF, /^#[0-9]+$/) {
if (substr($NF, RSTART+1, RLENGTH) in arr) {
sub(/^#[[:space:]]+/, "", [=10=]); print [=10=]
}
}
' Install.txt ExtraExt.sys
输出
Read $[CORE_DIR]/myBorderStyle #203
Read $[EXTRA_DIR]/mMenu #301
Read $[EXTRA_DIR]/DashToDock #602
Read $[EXTRA_DIR]/deskSwitch #603
我需要有关简单破折号脚本解决方案的帮助。读取文件值的脚本:“Install.txt”,(示例内容):
TRUE 203
TRUE 301
TRUE 602
TRUE 603
这些数字将与文件中的相同数字(在行尾)相对应:“ExtraExt.sys”,(示例内容):
# Read $[EXTRA_DIR]/diaryThumbPlace #202
# Read $[CORE_DIR]/myBorderStyle #203
# Read $[EXTRA_DIR]/mMenu #301
# Read $[EXTRA_DIR]/dDecor #501
# Read $[EXTRA_DIR]/controlPg #601
# Read $[EXTRA_DIR]/DashToDock #602
# Read $[EXTRA_DIR]/deskSwitch #603
所有行都带有标记 (#)。该脚本将取消标记与文件“install.txt”中具有相同编号的相应行。例如,TRUE 203 将取消标记以 #203
结尾的行# Read $[CORE_DIR]/myBorderStyle #203
到(阅读前没有“#”)
Read $[CORE_DIR]/myBorderStyle #203
我搜索了 awk/sed 解决方案,但这需要一个循环来遍历 Install.txt 中的数字。
感谢任何帮助。谢谢。
你可以试试,
# store "203|301|602|603" in search variable
search=$(awk 'BEGIN{OFS=ORS=""}{if(NR>1){print "|"}print ;}' Install.txt)
sed -r "s/^# (.*#($search))$//g" ExtraExt.sys
你明白了,
# Read $[EXTRA_DIR]/diaryThumbPlace #202
Read $[CORE_DIR]/myBorderStyle #203
Read $[EXTRA_DIR]/mMenu #301
# Read $[EXTRA_DIR]/dDecor #501
# Read $[EXTRA_DIR]/controlPg #601
Read $[EXTRA_DIR]/DashToDock #602
Read $[EXTRA_DIR]/deskSwitch #603
或者,-i 文件编辑选项
sed -i -r "s/^# (.*#($search))$//g" ExtraExt.sys
使用 awk 的一个选项可能是读取第一个文件 Install.txt 并将第二个字段的值存储在 arr
读取第二个文件 ExtraExt.sys 您可以使用 $NF
获取最后一列的数字并将其与模式 ^#[0-9]+$
[ 匹配=18=]
如果有匹配,从匹配中删除 #
部分,只留下数字并检查数字是否在 arr
.
如果是,打印当前行,不带前导#
awk '
FNR==NR{
arr[]
next
}
match ($NF, /^#[0-9]+$/) {
if (substr($NF, RSTART+1, RLENGTH) in arr) {
sub(/^#[[:space:]]+/, "", [=10=]); print [=10=]
}
}
' Install.txt ExtraExt.sys
输出
Read $[CORE_DIR]/myBorderStyle #203
Read $[EXTRA_DIR]/mMenu #301
Read $[EXTRA_DIR]/DashToDock #602
Read $[EXTRA_DIR]/deskSwitch #603