我的目标是使用tr从输入文件xor和42获取每个字节。 但是我被困在这一点上:
tr '\0-\377' '?'
任何人都可以提供帮助?非常感谢..
一些限制:
翻译必须由tr。
完成我们被允许使用bash脚本,但它不应该使用任何临时文件。 (换言之,只有管道)
答案 0 :(得分:3)
单独使用tr
这是不可能的,因为它 - 正如名称所示 - 只是从一个代码集转换为另一个代码集。不支持数学计算或逻辑运算。
顺便说一句,如果你想使用数值来解决整个ascii范围,你必须使用八进制数。在这种情况下,范围将是\0-\377
。但无论如何,计算xor值是不可能的。
您可以做的是准备一张包含xor ^ 42&as-ascii值的表格并用作SET2。我使用python创建该列表:
xor.py
v = []
for i in range(0,255):
v.append("\\" + oct(i^42))
print("".join(v))
或者简单地说:
print("".join(["\\" + oct(i^42) for i in range(0,255)]))
然后使用它为tr
创建SET2:
tr '\0-\0377' "$(python xor.py)" < input.file
注意:当已经需要python时,为什么不在整个解决方案中使用python?
由Mark Setchell编辑
作为Peter pointed out,此列表当然可以提前生成,然后作为SET2的字符串传递。这不需要运行时python调用。像这样:
tr '\0-\0377' '\052\053\050\051\056\057\054\055\042\043\040\041\046\047\044\045\072\073\070\071\076\077\074\075\062\063\060\061\066\067\064\065\012\013\010\011\016\017\014\015\02\03\0\01\06\07\04\05\032\033\030\031\036\037\034\035\022\023\020\021\026\027\024\025\0152\0153\0150\0151\0156\0157\0154\0155\0142\0143\0140\0141\0146\0147\0144\0145\0172\0173\0170\0171\0176\0177\0174\0175\0162\0163\0160\0161\0166\0167\0164\0165\0112\0113\0110\0111\0116\0117\0114\0115\0102\0103\0100\0101\0106\0107\0104\0105\0132\0133\0130\0131\0136\0137\0134\0135\0122\0123\0120\0121\0126\0127\0124\0125\0252\0253\0250\0251\0256\0257\0254\0255\0242\0243\0240\0241\0246\0247\0244\0245\0272\0273\0270\0271\0276\0277\0274\0275\0262\0263\0260\0261\0266\0267\0264\0265\0212\0213\0210\0211\0216\0217\0214\0215\0202\0203\0200\0201\0206\0207\0204\0205\0232\0233\0230\0231\0236\0237\0234\0235\0222\0223\0220\0221\0226\0227\0224\0225\0352\0353\0350\0351\0356\0357\0354\0355\0342\0343\0340\0341\0346\0347\0344\0345\0372\0373\0370\0371\0376\0377\0374\0375\0362\0363\0360\0361\0366\0367\0364\0365\0312\0313\0310\0311\0316\0317\0314\0315\0302\0303\0300\0301\0306\0307\0304\0305\0332\0333\0330\0331\0336\0337\0334\0335\0322\0323\0320\0321\0326\0327\0324' < inputFile > outputFile